利用主线程与子线程间的消息通讯,实现任务处理队列

http://hi.baidu.com/dushm/item/14eb022b30a21df950fd873b

From: http://www.delphibbs.com/keylife/iblog_show.asp?xid=27182

主题:利用主线程与子线程间的消息通讯,实现任务处理队列.

目标:主线程只需发命令(消息)通知子线程需要处理的内容,而不用管任务的处理进度,可以发任意个命令,而子线程依次取出主线程交付的任务来处理.

步骤:
     1.主线程通过PostThreadMessage将命令消息发送给子线程,可以利用wParam与lParam传递需要的参数.
     2.子线程执行代码中建立一个消息循环,PeekMessage从消息队列提取消息,若无消息,则用
MsgWaitForMultipleObjects等待消息或事件对象.

示例代码:

const
   WM_TEST=WM_USER+1;
  
var
   hCloseEvent:THandle;
   ThreadID:DWORD;

type
   TTestThread=class(TThread)
   protected
     procedure Execute;override;
   end;

procedure TTestThread.Execute;
var
   msg:TMsg;
begin
   try
     while True do
     begin
       if not PeekMessage(msg,0,0,0,PM_REMOVE) then
       begin
         case MsgWaitForMultipleObjects(1,hCloseEvent,False,INFINITE,QS_ALLINPUT) of
           WAIT_OBJECT_0: Break;//hCloseEvent事件已经有效,故结束
           WAIT_OBJECT_0+1:Continue;//消息队列中有消息存在
           else Break;//其它情况,WM_FAILED或WAIT_ABANDONED_0,表明已经出错,故结束
         end;
       end else
       begin
         if WaitForSingleObject(hCloseEvent,0)<>WAIT_TIMEOUT then Break;
         case msg.message of
           WM_TEST:
           begin
             //...接到主线程发过来的命令,作相应处理
             //...处理完之后,也可以用消息通知主线程
           end;
         end;
       end;  
     end;
   finally
     //...作善后处理
   end;
end;

procedure TForm1.btnCmdClick(Sender: TObject);
begin
   //给子线程发送消息
   PostThreadMessage(ThreadID,WM_TEST,0,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   //建立事件对象以及子线程,并保存子线程的ThreadID,用以调用PostThreadMessage
   hCloseEvent:=CreateEvent(nil,True,False,0);
   ThreadID:=TTestThread.Create(False).ThreadID;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   SetEvent(hCloseEvent);
   CloseHandle(hCloseEvent);
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
   SetEvent(hCloseEvent);
end;


在 Python 中,线程线程可以通过共享变量或队列进行通信。 一种常见的方法是使用共享变量。在线程中创建一个共享变量,然后将其作为参数传递给线程线程可以修改共享变量的值,线程可以读取该值。需要注意的是,对于多个线程同时访问共享变量时,需要采取适当的同步机制(如锁)来避免竞争条件。 另一种方法是使用队列(Queue)。线程可以创建一个队列,并将其作为参数传递给线程线程可以将数据放入队列中,而线程可以从队列中读取数据。队列提供了线程安全的操作,因此不需要显式的同步机制。 下面是一个简单示例,演示了线程线程的通信: ```python import threading import queue def child_thread(queue): # 线程队列中放入数据 data = 'Hello from child thread!' queue.put(data) def main_thread(queue): # 线程队列中读取数据 data = queue.get() print(data) def main(): # 创建一个队列 q = queue.Queue() # 创建线程并传递队列 t = threading.Thread(target=child_thread, args=(q,)) t.start() # 线程队列中读取数据 main_thread(q) if __name__ == '__main__': main() ``` 在上面的示例中,线程创建了一个队列 `q`,然后创建一个线程并将队列作为参数传递给线程线程队列中放入数据。线程调用 `main_thread` 函数从队列中读取数据,并打印出来。 这只是其中一种通信方式,具体的实现方式可以根据实际需求来选择。同时,还有其他更高级的通信机制,如事件、信号量等,可以根据具体情况选择使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值