代码之家  ›  专栏  ›  技术社区  ›  Charles Faiga

tthread.resume在Delphi-2010中已被弃用,应在适当的地方使用什么?

  •  33
  • Charles Faiga  · 技术社区  · 16 年前

    在我的多线程应用程序中

    我使用 暂停 TestRead简历

    自从将我的应用程序迁移到Delphi2010之后,我收到了以下警告消息

    [DCC警告]xxx.pas(277):不推荐使用w1000符号__resume_

    如果简历被否决,应该使用什么?

    编辑1:

    我用 简历 启动线程的命令-创建时将“createSupspended”设置为true和 暂停 在我终止线程之前。

    编辑2:

    Here is a link the delphi 2010 manual

    8 回复  |  直到 12 年前
        1
  •  26
  •   RRUZ    16 年前

    查尔斯,如果你读了三年级的代码,你能找到答案吗?

       TThread = class  
       private type  
    
    ..
    ..
    ..   
       public  
         constructor Create(CreateSuspended: Boolean);  
         destructor Destroy; override;  
         procedure AfterConstruction; override;  
         // This function is not intended to be used for thread synchronization.  
         procedure Resume; deprecated;  
         // Use Start after creating a suspended thread.  
         procedure Start;  
         // This function is not intended to be used for thread synchronization.  
         procedure Suspend; deprecated;  
         procedure Terminate;  
    

    看到这个链接 http://wings-of-wind.com/2009/08/28/rad-studio-2010-community-pulse-the-day-after-part-2/

    编辑:

    如果需要同步线程,可以使用基于tmutex、tevent和critical部分的方案。

    再见。

        2
  •  12
  •   PhiS    16 年前

    使用tthread.start而不是.resume

    --编辑—— 当然,start只能与delphi 2010(以及更高版本,大概)一起用于启动一个被创建为挂起的线程(在这里您以前会使用resume)。

    不建议使用resume/suspend(或相应的winapi函数)进行线程同步。查看讨论 here (看看巴里凯利的评论)。

        3
  •  6
  •   Deltics    16 年前

    暂停 简历 螺纹 类(如果查看源代码,您将看到suspend方法直接无条件地将布尔值设置为指示的线程挂起状态,而不是从线程句柄的执行计数更可靠地派生此状态。具有讽刺意味的是 简历 方法确实使用了这个更健壮的指标来 更新 挂起状态布尔值)。

    这可能就是他们被否决的原因。这也是为什么我实现了自己的类,用一个更健壮的挂起和恢复机制来封装Windows线程,以及 重新启动 完成后的线程。

    我不知道为什么他们的贬低被认为与同步有关。挂起和恢复线程不一定与同步有关,尽管我可以看到它可能是怎样的。值得注意的是,.NET框架线程类中的等效方法同样标记为已过时。线程挂起/恢复的Windows API文档中也出现了相同的注释w.r.t同步。

    如果使用不推荐使用的方法会使您紧张,并且您仍然希望挂起/继续,则可以始终使用Windows API来 suspend and resume the thread by reference to it's handle .

        4
  •  4
  •   Andrej KirejeÅ­    16 年前

    线程行为控制代码应该位于线程过程中。使用适当的同步对象和相应的API调用以挂起/恢复线程执行。从外面做是一种危险的做法。因此,有一个决定要将其贬低。

        5
  •  4
  •   Sam    12 年前

    为了以防万一,你只想去掉编译器提示

    (1)当 启动线程

    代替

    MyThread := TMyThread.Create(True);
    MyThread.Resume;
    

    具有

    MyThread := TMyThread.Create(True);
    MyThread.Start;
    

    (2)当 停止线程 ……

    代替

    MyThread.Suspend;
    MyThread.Terminate;
    

    具有

    MyThread.Terminate;
    

    一点都不重要。当心 试图混淆 .

        6
  •  3
  •   Andriy Gerasika    15 年前

    您应该按如下方式创建线程:

    constructor TSignalThread.Create;
    begin
     // create event handle first!
      FEventHandle := CreateEvent(
              {security}      nil,
              {bManualReset}  true,
              {bInitialState} false,
              {name}          nil);
      FWaitTime := 10;
      inherited Create({CreateSuspended}false);
    end;
    

    这样就不需要呼叫启动。

    http://www.gerixsoft.com/blog/delphi/creating-threads 以解释此代码的工作原理。

        7
  •  3
  •   Ilya    12 年前

    使用

    Suspended := False; // Resume;
    

    Start;
    
        8
  •  2
  •   ciuly    14 年前

    @米吉(我知道有点晚了)

    例如madexcept和类似的。如果应用程序崩溃,并向用户显示错误报告,这意味着对话框等待使用输入。如果发生崩溃是线程操作的结果(不一定是线程崩溃),如果不挂起线程,屏幕将充满错误报告对话框。

    示例2:日志记录。至少出于任何特定的原因,我需要记录一些线程的执行状态。包括当前堆栈跟踪。现在,正如您应该知道的,当线程运行时,您不能这样做,因为在收集有关它的信息的过程中,线程一直在做一些事情,所以在您完成收集时,收集到的信息将不一致。因此,需要挂起线程。

    我可以继续介绍线程管理的实际例子。当然,这些并不是您在日常编程中所做的事情,但至少第一个示例我确信您中的许多人正在使用,即使您不知道它的内部结构。Debuggers?再一次,你使用它们。 但实际上,在所有这些情况下,都不使用tthread,因为这项工作是在线程句柄上完成的。因此,实际上,tthread suspend用法的一个有效示例很难找到。但总的来说,这是另一个故事。