while GetMessage(MsgRec, 0, 0, 0) do
begin
 TranslateMessage(MsgRec);
 DispatchMessage(MsgRec);
 //Sleep(1000);
 if abool=true then  Break;
end;当我发送了消息队列的时候,发送完之后,线程会处于休眠状态,这时候该怎么样做才可以让线程重新唤醒或者结束他呢?个人想法:
  在主窗中插入一个定时器,然后在定时器执行的代码中写入
   PostThreadMessage(ThreadId,WM_QUIT,0,0) //僵哥代码
  到一定的时候就执行一下上面的代码让他退出他  而这时候的问题来了.
   PostThreadMessage当中的Threadid参数我如何获得,从上面的循环中我看中了一个msgrec我是否能够替换Treadid呢?替换成下面的
            PostThreadMessage(MsgRec,WM_QUIT,0,0)
      替换后,我发现WM_QUIT出现提示
            incompatible types: 'cardinal' and 'tagMsg'
     简单来说就是类型不一样无法替换... 问题1:我在主窗体内写这样的代码会不会有其他的问题存在?
 问题2:应该怎么解决休眠问题和如何传递参数到主窗体的定时器中                  加前面的贴子一共三百分。。下了狠本了。。希望这一次能够解决了.....我知道僵哥不是贪分的人。这只是表示我的诚意。这个问题弄得太久了。再不弄好。可要被老板炒犹鱼了。。帮帮忙。。

解决方案 »

  1.   

    http://topic.csdn.net/u/20090109/04/a6682b83-5e79-4ee8-a333-cec1383ffa9d.html原贴子
      

  2.   

    TThread有一个成员属性ThreadId,使用GetMessage就不需要休眠了,只要没有消息到达会一直卡在GetMessage当中等消息。当你需要结束或者做操作就直接PostThreadMessage,或者对其中的某个窗口句柄SendMessage/PostMessage就好了。
      

  3.   

    即使使用的不是TThread,也可以通过GetCurrentThreadId取得当前线程的ThreadId
      

  4.   

    [Error] Tposta.pas(247): Undeclared identifier: 'WM_QUIT'他提示并没有找到这个,我该如何找寻他
      

  5.   

    这不是机子问题,而是需要Messages单元。
      

  6.   

    定时器并不会有什么问题,只是在定时器响应处理过程当中,如果不是非常必要的话,可以添关闭定时器(Enabled = false)防止消息重入。
      

  7.   

    僵哥,有没有办法判断getmessage是否在休眠状态呀?
      

  8.   

    if GetMessage(MsgRec, 0, 0, 0)<>null then
     PostThreadMessage(TbeadID,WM_Quit,0,0); 这样好像就可以了。。