- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 c++ builder (bcb6) 和 on:
FormShow
事件有:
Application->ProcessMessages
我想知 Prop 体责任是什么:
Application->ProcessMessages
它到底做了什么?我们什么时候用那个?什么时候会导致exp.?
谢谢!
最佳答案
BDS 2006 IDE 帮助说明 Application->ProcessMessages
是这样的:
中断应用程序的执行,以便它可以处理消息队列。
调用ProcessMessages
以允许应用程序处理当前在消息队列中的消息。 ProcessMessages
循环 Windows 消息循环直到它为空,然后将控制权返回给应用程序。
忽略消息处理只会影响调用 ProcessMessages
的应用程序,不会影响其他应用程序。在冗长的操作中,定期调用 ProcessMessages
允许应用程序响应绘制和其他消息。
ProcessMessages
不允许应用程序空闲,而 HandleMessage
允许。
那是为了什么?
如果您的应用阻止正常的 WindProc 操作(在 VCL 内),它允许响应 Windows 消息。例如,如果您对某些需要几分钟的事件进行了冗长的计算,应用程序将卡住(无法单击、移动、调整大小、重绘……直到操作完成)。如果您偶尔从那个长循环中调用 ProcessMessages
(计时器在此期间也不会工作),这将使您的应用程序在此期间响应......所以它不会卡住。
我通常使用threads or OnIdle event而不是进行此类计算,因此根本不会阻止主应用程序。
我不愿意相信 OnShow
在这种阻塞期间被调用。我会将 ProcessMessages
放在阻止应用程序的计算中(如果计算在 OnShow
中,那么它是 OK 否则它将毫无用处无论如何,OnShow
仅在您的表单变为Visible
时才被调用,不要将其误认为是OnActivate
或OnPaint
。
小例子
创建空表单应用程序并在其中放置 2 个按钮 (btStart,btStop
),然后为它们创建点击事件,如下所示:
//---------------------------------------------------------------------------
bool go=false;
//---------------------------------------------------------------------------
void __fastcall TForm1::btStartClick(TObject *Sender)
{
int i=0;
for (go=true;go;)
{
Caption=i; i++;
Application->ProcessMessages();
Sleep(100);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btStopClick(TObject *Sender)
{
go=false;
}
//---------------------------------------------------------------------------
当您启动应用程序并单击 btStart
时,它将开始递增 Form1
的 Caption
字段中的整数,并在您单击 时停止bt停止
。在计数期间应用程序仍然响应(可以单击、移动、调整大小...)。您需要在关闭 App 之前停止(析构函数等待从所有事件返回)。如果您移除 Application->ProcessMessages();
则应用程序将计数但永远不会停止,因为由于卡住您无法单击 btStop
。要关闭,请单击 IDE 并按 CTRL+F2。
希望它能把事情弄清楚一些。
关于c++ - OnShow 事件上的 ProcessMessages c++ builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997097/
我创建了一个组件,该组件将硬件加速渲染器嵌入到 TWinControl 中,以便您可以将其放置在表单上。它在大多数情况下工作得很好,但如果我尝试调整控件的大小,一切都会变成空白,直到消息循环运行并调用
我需要知道使用允许我使用整个应用程序的 ProcessMessages 是否合法。 伪代码: 主线程按钮调用 - 搜索。 procedure ButtonOnClick; begin var1
我正在编写在C++ Builder项目中使用的网络DLL。该DLL与远程FTP服务器一起使用。调用recv()时,我注意到一个奇怪的行为。有时它返回0。但是在另一个线程中,在同一套接字上调用recv(
有一个 MessageListener 监听来自用户 A 的 processMessage,当 sendMsg 从另一个用户发送到用户 A 时,我看到 processMessage 被调用两次: pu
我有一个应用程序,我将表单用作消息框,在这个“消息框”中,我运行线程来更改其上的消息线程完成后,在消息框上我显示按钮,只有在单击按钮代码后才能继续 var FStart: TFStart; V
我的单线程delphi 2009应用程序(尚未完成)已经开始出现Application.ProcessMessages挂起的问题。我的应用程序有一个 TTimer 对象,每 100 毫秒触发一次以轮询
我有以下代码,它正确在消息框中显示InvoicingUnit。它还可以正确显示标题中的值。 ADItemRecord := GetInvItemRecord(txtItemCode.Text);
使用 TWebBrowser 的示例代码通常会插入一个循环来调用 Application.ProcessMessages,直到 ReadyState 为 READYSTATE_LOADED。 例如,来
我想将一个 div 降低到一定高度以显示一些额外的内容。为此,我编写了以下 dropbox() 函数: function sleep(milliseconds) { var
我的 Cordova 应用程序未在浏览器和移动设备中运行,它显示错误 processMessage failed 截图: 然后进入无限循环并卡住设备任何解决方案? 这个问题已经在这里问了Cordova
我正在将 C++ 应用程序转换为 C#,我在代码库的许多地方都遇到过这一行代码: Application->ProcessMessages() 我找到了这个链接:http://docs.embarca
我带着另一个关于线程和同步的问题回来了。想象一个服务器应用程序必须执行一个冗长的操作,并且客户端希望他的 GUI 在他等待服务器响应时保持响应。我想到了以下模式: TMonitor.Enter (FT
Application.ProcessMessages 命令是众所周知的,我在长进程中使用它来确保我的程序不会占用计算机。 但是我有一组相当快的处理,我将 View 缓冲到文件中。在缓冲过程中,可能会
我有一个可以运行很长时间扫描数据库的应用程序。 在此过程中,我使用 processmessage 保持程序响应。 当我的进度条更新并增加时,会触发此进程消息。 在大多数情况下,这工作得很好,但是当数据
在线程(不是主线程)内调用 Application.Processmessages 是否“可以”,还是我应该预料到麻烦? 最佳答案 TApplication.ProcessMessages() 主要用
我这里有一个遗留应用程序,它有一些“耗时”的循环,这些循环由于各种用户交互而被触发。耗时的代码定期更新屏幕上的某些内容以及进度信息(通常是标签),然后,似乎是为了说服视觉刷新立即发生,代码调用 App
我正在使用 Delphi 7。我试图在非 VCL 单元中添加一个调用“application.processmessages”的过程。我收到错误“未声明的标识符:应用程序”。 如何从非 vcl 单元引
在维护旧产品时,我遇到了一个错误,该错误导致屏幕上充满了数百个消息框,上面写着“C++ 异常”,没有其他任何内容。我将问题追溯到以下行: Application->ProcessMessages();
我正在使用 c++ builder (bcb6) 和 on: FormShow 事件有: Application->ProcessMessages 我想知 Prop 体责任是什么: Applic
我需要一种方法来暂停函数的执行几秒钟。我知道我可以使用 sleep 方法来做到这一点,但这种方法在执行时会“卡住”应用程序。我也知道我可以使用类似下面的代码来避免卡住: // sleeps for 5
我是一名优秀的程序员,十分优秀!