窗体、线程、消息(题目不知道怎么说,大家进来看看吧)

YaYiYaO 2006-05-26 10:51:01
能否在主线程阻塞的情况下,用另外一个线程创建一个窗口,并且能处理窗体消息,响应用户的操作??
...全文
249 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
YaYiYaO 2006-05-29
  • 打赏
  • 举报
回复
to wen_zang(文臧):
不要灌水,说些有建设性的话

up!!!!!!!
Kingron 2006-05-28
  • 打赏
  • 举报
回复
其实同步可以指定窗口的线程的,这样可以使用另外的消息线程来处理消息。要求就是在线程中创建窗体即可,则该动态创建的窗体可以和主线程消息队列无关。
智能大石头 2006-05-28
  • 打赏
  • 举报
回复
在主线程不阻塞的情况下,我花了两个月时间,终于让子线程里面的窗体独立工作,有意知道的请到QQ群里讨论 群号 5197351
comanche 2006-05-28
  • 打赏
  • 举报
回复
个人觉得没什么办法, 主线要是阻在 vcl 上, 就会进入一个 vcl 全局锁, delphi 3 之前没这个锁, delphi4 也是要求用 thread.Synchronize, 到了 delphi5 以上版本似乎不管有没有 thread.Synchronize 就会进入 vcl 全局锁
wen_zang 2006-05-28
  • 打赏
  • 举报
回复
在循环中多使用
Application.ProcessMessages;
一般不会是进程堵塞的
YaYiYaO 2006-05-28
  • 打赏
  • 举报
回复
to Kingron(单身走我路……):
在线程中创建窗体,我也试过,创建窗体后调用Form.Show,就阻塞了,根本执行不到下面的消息循环中去
YaYiYaO 2006-05-27
  • 打赏
  • 举报
回复
似乎也不可以哎,线程调用GetMessage()就阻塞了

消息和线程有关系的吗,是不是消息都发给创建窗体的那个线程的呢?
comanche 2006-05-26
  • 打赏
  • 举报
回复
是吧, 这个问题复杂, 主线是被 vcl 阻塞的偶也没办法, 对不住哈
YaYiYaO 2006-05-26
  • 打赏
  • 举报
回复
to comanche(太可怕):
你有没有试过啊,我在提这个问题之前就试过这样做,没有用的。
comanche 2006-05-26
  • 打赏
  • 举报
回复
可以 线程体没内容, 下面是简单做法, 主线程就是一直在干这样的事的
procedure Execute;
begin
while not Termianted then
begin
Sleep(50);
Application.ProcessMessages;
end;
end;


procedure TApplication.Run;
begin
FRunning := True;
try
AddExitProc(DoneApplication);
if FMainForm <> nil then
begin
case CmdShow of
SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;
SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;
end;
if FShowMainForm then
if FMainForm.FWindowState = wsMinimized then
Minimize else
FMainForm.Visible := True;
repeat
try
// 这句
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;

procedure TApplication.HandleMessage;
var
Msg: TMsg;
begin
if not ProcessMessage(Msg) then Idle(Msg);
end;
YaYiYaO 2006-05-26
  • 打赏
  • 举报
回复
消息一定是主线程的吗?
我前段时间用一个线程(不是主线程)调用ttimer,发现不会触发ontimer事件,后来查了msdn关于WM_TIMER消息,上面是这么说的:
“The WM_TIMER message is posted to the installing thread's message queue when a timer expires.”
这是不是说明消息不一定是由主线程处理的呢

这里我们不讨论结构问题,这个情况太多了。这里讨论这个能否实现。
KL2 2006-05-26
  • 打赏
  • 举报
回复
不行吧,窗体消息是主线程的。
设计也有问题,主线程不应该被阻塞,一些繁重的工作应该交给另外的线程。
bomdy 2006-05-26
  • 打赏
  • 举报
回复
给线程建立消息循环应该就可以了的,我在VC下这样用过,不过没在delphi中这样用过
GetMessage()
TranslateMessage()
DispatchMessage()
YaYiYaO 2006-05-26
  • 打赏
  • 举报
回复
哦,没有关系的,大家只是讨论讨论

难道真的就不行了吗??

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧