C ++新手问题:ThreadProc

时间:2009-07-20 21:24:39

标签: c++

我只是想了解一些用C ++编写的源代码。我有点熟悉 但是,使用C ++,以下代码序列对我来说是绝对新的。猜测就是 在这里我用内核注册一些线程例程,ptest-> Run()。那可能是对的吗?

static unsigned int __stdcall ThreadProc(void *lParameter)  
{  
CTest *ptest;  

ptest= (Ctest *)lParameter;  
ptest->Run();  
return 0;  
 }  


CTest::CTest(int n)  
{  
...  
}  

5 个答案:

答案 0 :(得分:2)

有点简化但是线程是一个函数,在本例中是ThreadProc。当线程启动时,调用该函数,当函数退出时,线程就会死掉。

在这种情况下,有人用CreateThread,begin_thread或其他东西启动了一个线程,并将指向一个名为CTest的类作为参数传入。然后线程将其强制转换为CTest *(因为您可以看到参数由CreateThread API作为更通用的void *传递)并在退出之前调用CTest :: Run方法。

编辑:此外,除了“__stdcall”声明外,这不是特定于Windows的。 C和C ++中的线程在所有操作系统上都或多或少地工作。

答案 1 :(得分:1)

不完全。这是你的线程函数:

static unsigned int __stdcall ThreadProc(void *lParameter)

它将执行与导致它不同的任何线程。调用代码创建一个CTest类型的对象,创建一个运行ThreadProc的线程,然后运行ptest-> Run();

ThreadProc只是一个方便的包装器来启动ptest-> Run()。 (因为否则很难使用指向成员函数的指针)

答案 2 :(得分:1)

这是一个函数签名,用于定义从DLL导出或用作回调函数的函数。在这种情况下,它可能会被用作工作线程的主循环。

__stdcall关键字表示使用stdcall calling convention in Windows在堆栈上传递函数调用(与从Win32 API导出的方法使用的相同)

OOPS:此链接与markdown http://msdn.microsoft.com/en-us/library/zxk0tw93(VS.80).aspx

的效果不佳

答案 3 :(得分:0)

什么操作系统?看起来像一个Windows示例,如果是这样的话,那就是begin_thread(),或者CreateThread或者......几个

答案 4 :(得分:0)

您显示的代码声明了一个指向CTest类对象的指针,将输入参数转换为其中一个,然后调用其run方法。

为什么这样做是非常棘手的部分。通常你不会写这样的代码,但是,ThreadProc的配置文件是线程主入口点的配置文件。对于其中之一,Windows不会为您提供任何参数配置文件的选择,也不能成为类成员。

你有什么相当标准的代码将线程入口点回调从Windows的必需形式转换为类方法调用。

如需对此进行全面讨论,请参阅我的(已接受)答案:Passing Function pointers in C++