相关疑难解决方法(0)

Delphi队列和同步

我正在网上阅读Nick Hodges,我发现了Queue,但它并没有像我预期的那样表现,我无法理解他和文档所说的内容.看看这段代码:

 TThread.CreateAnonymousThread(
  procedure
   begin

     TThread.Queue(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Clear;
                                           Memo1.Lines.Add('start');
                                          end);

     Sleep(2000);

     TThread.Synchronize(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Add('end');
                                          end);

   end
 ).Start;
Run Code Online (Sandbox Code Playgroud)

我总是使用,Synchronize但这次我尝试过,Queue因为根据尼克,在多个请求的情况下更好,因为它们不会被"序列化"并逐个执行.上面的代码工作正常.为什么这不起作用呢?

 TThread.CreateAnonymousThread(
  procedure
   begin

     TThread.Queue(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Clear;
                                           Memo1.Lines.Add('start');
                                          end);

     Sleep(2000);

     TThread.Queue(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Add('end');
                                          end);

   end
 ).Start;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,备注输出start但不是结束.我打电话的时候:

  • 在第一个上同步,在第二个上同步它
  • 队列在第一个,同步在第二个它工作
  • 两次排队它都不起作用,因为我只看到start备忘录中的内容

delphi multithreading

14
推荐指数
1
解决办法
5730
查看次数

替代TControl.Perform

TControl.Perform代码是:

var
  Message: TMessage;
begin
  Message.Msg := Msg;
  Message.WParam := WParam;
  Message.LParam := LParam;
  Message.Result := 0;
  if Self <> nil then WindowProc(Message);
  Result := Message.Result;
Run Code Online (Sandbox Code Playgroud)

程序执行等待返回,我是对的吗?

有一种替代方法,用于在同一个应用程序中的另一个线程内的TFORM队列中发布消息,而无需等待返回?

编辑

这种方法可以缓解这个问题吗?

interface

const  
  WM_DOSTUFF = WM_APP + $001;

TMyForm = class(TForm)
{stuff}
public
{Other stuff}
  procedure DoMyStuff(var Msg: TMessage); message WM_DOSTUFF;   
{More stuff}
end;  

var
  MyHandle: HWND;

implementation

constructor TMyForm.Create(AOwner: TComponent);
begin
  inherited;
  MyHandle := AllocateHWnd(DoMyStuff);
end; 

destructor TMyForm.Destroy;
begin
  DeallocateHWnd(MyHandle);
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

并且通常在线程内使用:

  PostMessage(MyHandle, WM_DOSTUFF, 0, 0);   
Run Code Online (Sandbox Code Playgroud)

windows delphi vcl message-queue

2
推荐指数
1
解决办法
695
查看次数

标签 统计

delphi ×2

message-queue ×1

multithreading ×1

vcl ×1

windows ×1