标签: tthread

delphi - 在关闭应用程序时终止所有线程(TThread)

我的应用程序是一个tcp/ip服务器,主线程只创建一次并且一直在监听.当新客户端连接时,主线程创建TClientThread类型的新线程.但是没有运行客户端线程的列表,因为这会使我的应用程序有点复杂...有没有办法在所有线程上执行"terminate"方法,即使线程忙(在我的情况下"忙")意味着它正在等待数据,超时设置大约是30秒......所以无论如何我都要杀掉它,而不是等待.)?简单的关闭应用程序似乎不会在线程上运行"terminate"方法,最终会导致FastMM报告内存泄漏...

delphi tthread terminate fastmm

4
推荐指数
1
解决办法
5729
查看次数

我什么时候需要在TThread中同步?

我知道你需要synchronize (yourprocedure)设置例如标签的文字.但是关于:

  1. 阅读标签的文字.
  2. 切换/设置标签的启用属性.
  3. 调用其他标签程序/功能(例如onclick事件).

当我需要使用时,是否有一个简单的规则来了解/记住synchronize

PS.:同步类似于PostMessage/SendMessage吗?

delphi multithreading tthread

4
推荐指数
1
解决办法
297
查看次数

在阻塞主线程中使用 TEvent 和 MsgWaitForMultipleObjects

我发现了这个 Remy 有趣的代码。 Delphi:如何在本地创建和使用线程?

是否可以这样做,以便我可以执行多个线程并等待它们全部完成然后继续主线程?我像这样尝试过但没有成功......

procedure Requery(DataList: TStringList);
var
  Event: TEvent;
  H: THandle;
  OpResult: array of Boolean;
  i: Integer;
begin
  Event := TEvent.Create;
  try
    SetLength(OpResult, DataList.Count); 
    for i:=0 to DataList.Count-1 do begin
      TThread.CreateAnonymousThread(
        procedure
        begin
          try
            // run query in thread
            OpResult[i]:=IsMyValueOK(DataList.Strings[i]);
          finally
            Event.SetEvent;
          end;
        end
      ).Start;
      H := Event.Handle;
    end;
    while MsgWaitForMultipleObjects(1, H, False, INFINITE, QS_ALLINPUT) = (WAIT_OBJECT_0+1) do Application.ProcessMessages;
    
    for i:=Low(OpResult) to High(OpResult) do begin
      Memo1.Lines.Add('Value is: ' + BoolToStr(OpResult[i], True));
    end;
  finally
    Event.Free;
  end;

  // Do next …
Run Code Online (Sandbox Code Playgroud)

delphi events multithreading tthread blocking

4
推荐指数
1
解决办法
178
查看次数

同步线程进行图像处理Delphi

我必须处理主要形式的一个图像,但处理速度低inc速度我使用线程...

我的线程代码:

type
  TPaintThread = class(TThread)
    Source,Mask :TBitmap ;
    image : TImage;
    public
       procedure SetAll(src,msk:TBitmap;img:TImage);
    private
     procedure  DoWritePix;
    var
       mBit : TBitmap ;

    protected
      procedure Execute; override;
  end;

implementation

procedure TPaintThread.SetAll(src: TBitmap; msk: TBitmap; img: TImage);
begin
      Source := src ;
      mask := msk ;
      img := img ;
      mBit := TBitmap.Create ;
end;

procedure TPaintThread.DoWritePix;
begin
  image.Picture.Bitmap := mBit ;
end;

procedure TPaintThread.Execute;
var
    i: Integer;
    j: Integer;
begin
  mBit.Width := Source.Width ;
  mBit.Height := Source.Height ;
  for i …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading synchronization tthread delphi-xe3

3
推荐指数
1
解决办法
990
查看次数

我可以在TThread的OnTerminate事件中引发异常吗?

我编写了一个TThread后代类,如果引发异常,则将异常的Class和Message保存在两个私有字段中

private
  //...
  FExceptionClass: ExceptClass;  // --> Class of Exception
  FExceptionMessage: String;
  //...
Run Code Online (Sandbox Code Playgroud)

我以为我可以raiseOnTerminate事件中遇到类似的异常,以便主线程可以处理它(这是一个简化版本):

procedure TMyThread.Execute;
begin
  try
    DoSomething;
    raise Exception.Create('Thread Exception!!');
  except
    on E:Exception do
    begin
      FExceptionClass := ExceptClass(E.ClassType);
      FExceptionMessage := E.Message;
    end;
  end;
end;

procedure TMyThread.DoOnTerminate(Sender: TObject);
begin
  if Assigned(FExceptionClass) then
    raise FExceptionClass.Create(FExceptionMessage);
end;
Run Code Online (Sandbox Code Playgroud)

我希望发生标准的异常处理机制(一个错误对话框),但我得到了混合的结果:对话框出现但后面是系统错误,或者(或者更有趣)对话框出现但是调用该线程的函数去了似乎从未提出异常.
我猜问题是关于调用堆栈.
这是个坏主意吗?
是否有另一种方法可以将线程异常与主线程分离,但以标准方式再现它们?
谢谢

delphi delphi-7 tthread

3
推荐指数
1
解决办法
2119
查看次数

如何捕获突然被毁坏的TThread

My Environment: Rad Studio XE4 using C++
Run Code Online (Sandbox Code Playgroud)

我正在使用TThread开发一个软件.最近,我遇到了一个问题,即在程序启动几天后,TThread突然被破坏.

在TThread中,线程使用Synchronize()方法更改表单(例如TLable)的显示.我想知道这可能会引起一些问题.

我正在记录线程中的几个部分,以便我可以找到问题的原因.但是当我检查日志时,我只能发现突然调用了TThread的析构函数.

TThread的FreeOnTerminate设置为true.

该程序运行两个线程.只有一个线程突然被破坏,另一个线程即使在问题发生后仍在工作.

我正在寻找如何解决这类问题的原因.

delphi c++builder tthread

3
推荐指数
1
解决办法
112
查看次数

首先在Indy 10的delphi中从服务器开始通信

在由TCPServer/Client组件编程的Socket应用程序中,通常我们是活动服务器端,然后将客户端连接到服务器,当我们需要从一侧获取或发送数据到另一端时,首先我们从客户端向服务器发送命令并且通信将是开始.

但问题是我们总是需要从客户端开始对话!

我想问一下,在没有客户端请求的情况下从服务器端随机开始会话是否有任何想法?

我需要此功能从服务器端通知客户端.例如,当注册用户(客户端)连接到服务器,其他连接用户(在其他客户端)时,通知必须从服务器发送给所有用户(如Yahoo Messenger).

我正在使用TIdCmdTCPServerTIdTCPClient组件

delphi tcp client-server indy tthread

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

使用 WaitForSingleObject() 等待 TThread 完成

我正在创建一个线程,然后说要等待它以 WFSO 调用终止(下面是简化的伪代码,显然没有人想在创建线程后立即等待它)。

constructor TFileScannerThread.Create(Parameters)
begin
/// assign parameters to private variables, and call
inherited Create(true);  //Create Suspended
FreeOnTerminate := true; 
Start; 
end;
Run Code Online (Sandbox Code Playgroud)

在主线程中

fst := TFileScannerThread.Create(BaseFolder, ScanMode, AbortEvent);

///  I presume, the next call would block the main thread until the child thread is done
///  but, it seems to create a deadlock & WFSO never returns
///  I get a WAIT_TIMEOUT if I use a finite wait time
WaitForsingleObject(fst.Handle, INFINITE);
Run Code Online (Sandbox Code Playgroud)

我做错了什么/错过了什么?如果我没有 WFSO,线程会在大约 10 秒内完成。

编辑:使用 FreeOnTerminate=false 创建不会产生此问题。

delphi multithreading tthread waitforsingleobject

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

Delphi - TThread可以在主VCL线程中更改变量的值吗?

使用:Delphi XE2,Windows VCL Forms应用程序

TThread在执行期间是否可以更改主VCL线程中变量的值?

需要更新一个被声明为TForm类的字段的Integer.它将作为重载(并重新引入)Create构造函数方法中的var变量传递给TThread.

这有什么后盾吗?

delphi tthread

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

为什么循环变量的值不存储在动态创建的AnonymousThread中

我对如何在动态创建中存储唯一标识符有一些学术兴趣TThread.

我创建这样的东西:

procedure TForm1.Button1Click(Sender: TObject);
var thrn:word;
begin
for thrn := 0 to 5 do//<--- this is a loop variable that should give the unique numbers
  TThread.CreateAnonymousThread(
    procedure()
    var
      i: longint;
      r: double;
      thrns:string;
    begin
      thrns:=inttostr(thrn);//in this thread? variable I try to store the ID as string
      repeat
        for i := 0 to 100000000 do
        begin
          r := random(high(i));//this loop gives some dummy job 
          r := sqr(r);         //to the thread to slow it down
        end;
        TThread.Synchronize(nil,
          procedure()
          begin …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading tthread

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