【问题标题】:How do you pause a thread?你如何暂停一个线程?
【发布时间】:2014-07-20 00:08:21
【问题描述】:

您好,我正在尝试暂停一个线程,但由于某种原因它不断使游戏崩溃。 这是我得到的

void Test(){
    SuspendThread((PVOID)0x83593C24);//0x83593C24 The offset from the game
    Scr_AddInt(1);
    ResumeThread((PVOID)0x83593C24);
}

基本上我试图暂停而不是调用 Add Int 而不是恢复它

【问题讨论】:

  • 线程不是某个内存地址。查找线程 ID 和进程 ID。
  • 我找到了 0x8354F7A8 的线程 ID,但我没有看到进程 ID gyazo.com/13a976b7993ce574ff9489d82110f1cc
  • 对于线程 ID 来说看起来太大了...
  • 我认为您需要提供更多信息,例如您的平台是什么(PowerPC?);什么库提供SuspendThreadResumeThread;以及您正在使用哪些编译器/线程库;以及那个疯狂的汇编器是什么。
  • 我使用 VS2012 编译我的代码。我提供的图片是显示 PowerPC 代码的 IDA Pro。并且库 SuspendThread 和 ResumeThread 在 winbase.h

标签: c++ powerpc


【解决方案1】:

您需要使用创建线程时返回的线程句柄。请参阅CreateThread 的文档; SuspendThread;和ResumeThread

特别是来自CreateThread 的文档:

如果函数成功,返回值是新线程的句柄。如果函数失败,返回值为NULL。

例子:

HANDLE thread_handle = CreateThread(/*args*/);  // hold on to this value (and check for failure)
if (thread_handle == NULL)
{
    // handle creation error
} 

DWORD suspend_retval = SuspendThread(thread_handle); 
if (suspend_retval == static_cast<DWORD>(-1))
{ 
    // handle suspend error
}

Scr_AddInt(1);  // original work  

DWORD resume_retval = ResumeThread(thread_handle);
if (resume_retval == static_cast<DWORD>(-1))
{ 
    // handle resume error
}

创建一个封装线程创建、暂停、恢复和终止的包装类可能是值得的。这个类可以在内部执行所有错误检查,并在适当的时候抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多