利用线程消息队列,实现任务队列

news/2024/7/4 1:43:48 标签: 任务, object, class, 通讯, user
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">   主题:利用主线程与子线程间的消息通讯,实现class="tags" href="/tags/RenWu.html" title=任务>任务处理队列.

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

步骤:
    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;
          WAIT_OBJECT_0+1:Continue;
          else Break;
        end;
      end else
      begin
        if WaitForSingleObject(hCloseEvent,0)<>WAIT_TIMEOUT then
          Break;
        if msg.hwnd<>0 then
        begin
          TranslateMessage(msg);
          DispatchMessage(msg);
          Continue;
        end else
        begin
          case msg.message of
            WM_TEST:
            begin
              //...接到主线程发过来的命令,作相应处理
              //...处理完之后,也可以用消息通知主线程
            end;
          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
  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;

http://www.niftyadmin.cn/n/1414996.html

相关文章

ESP8266类库的使用——以getVersion(void)方法为例

接着上一篇文章《ESP8266类库的使用——总体概述》我们来继续深入学习ESP8266库类的实现方法&#xff0c;以String getVersion(void)方法为例。在前期的文章《ArduinoESP8266连接WiFi》我们介绍了直接利用串口输入AT命令控制ESP8266芯片以实现相应的功能。在该文中可以通过输入…

(2)流程控制(for循环、if...else判断、while循环)

for循环 for item in names: #结构语法 print(item) for循环嵌套for循环 for循环配合range()可以直接指定要打印的数量 例&#xff1a;打印一个金字塔 for i in range(1,10): #先用一个for循环来决定打印多少行&#xff0c;print必须空 for x in range(20-i): #在嵌套一个fo…

ArcSDE命令

1、sdemon&#xff08;注意大小写&#xff09;(1) sdemon主要是用来管理sde服务,包括7种命令&#xff0c;查看sdemon所有的命令在命令行中输入sdemon -h即可 status 获取指定实例的状态 start 启动sde服务 shutdown 关闭SDE服务 pause 暂停服务(不接受连接) resume 重启服务…

Delphi指针简单入门

delphi指针简单入门: 看一个指针用法的例子&#xff1a; 1 var 2 X, Y: Integer; // X and Y 整数类型 3 P: ^Integer; // P 指向整数类型的指针 4 begin 5 X :17; // …

MFC修改空间ID值

在MFC资源编辑之后&#xff0c;对应的resource.h中&#xff0c;每个控件ID都会对应的一个值&#xff0c;在一个Page中的控件&#xff0c;其资源ID不会重复&#xff0c;但是不同Page中的ID值可以相同。 如果在一个page中的控件过多&#xff0c;在数据绑定的时候&#xff0c;针对…

bool ESP8266::recvFindAndFilter() 修改

对于上一篇文章《ESP8266类库的使用——以getVersion(void)方法为例》所遗留的两个问题进行解答&#xff0c;问题1&#xff1a;对于函数recvFindAndFilter( ) 的修改&#xff1b;问题2&#xff1a;串口的输出常有乱码的修改。 问题1&#xff1a;对于函数recvFindAndFilter( )…

面向对象之继承与派生,属性查找

目录: 继承 派生 属性查找 练习 继承:单/多 类和对象本质上是名称空间python2与python3在继承上的区别:  新式类:但凡继承object类的子类,以及该子类的子子类,...都称之为新式类  经典类:没有继承object类的子类,以及该子类的子子类,...都称之为经典类只有在python2中才区分…

迭代三测试报告

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff0c;点击下单之后&#xff0c;弹出支付窗口&#xff0c;显示订单号&#xff0c;支付号&#xff0c;该支付金额等信息&#xff0c;如下图 二&#xff0c;弹出支付窗口是&#xff0c;是否输入框自动获取焦点&…