如何修改CreateThread函数
How do I modify CreateThread function?
正如我的标题所说,我正在尝试修改CreateThread函数。我希望它使用循环来报告线程的序列号。
我对C++编程还很陌生,不确定哪个参数需要更改。我怀疑它可能是"lpParameter",但在查看了微软网站后(https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx)我仍然不明白这些参数是如何工作的。
到目前为止,我有:
int int_tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[numThreads];
int tNum[10];
for (int i = 0; i < numThreads; i++)
{
tNum[i] = i;
hThread[i] =
CreateThread(NULL, 0, helloFun, NULL, 0, NULL);
} WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
return 0;
}
它产生一个空白线程。
编辑:
抱歉大家搞糊涂了。我已经声明了线程例程:
const int numThreads = 4;
DWORD WINAPI helloFun(LPVOID pArg)
{
printf("Hello Thread n");
return 0;
}
目前尚不清楚您要做什么,但很明显,您在错误的位置调用了WaitForMultipleObjects
。
您正试图在只创建一个线程后等待numThreads
。hThread
数组的其余部分仍然未初始化,将野生句柄传递给WaitForMultipleObjects
是个糟糕的主意。
将等待呼叫移到循环之外。
您的线程例程必须声明为
DWORD name (LPVOID whatever)
作为lpParameter传递的内容都将传递给线程。在这种情况下,将integer强制转换为指针并返回。
如前所述,如果要将参数传递给线程,则使用lpParameter。它需要一个指针,所以您可以传递,例如&i
,尽管这不是一个好主意。您可以创建一个指向int的指针,并将其传递,然后在WaitForMultipleObjects
返回后删除。
正如本所说,你打错了WaitForMultipleObjects
的电话。
像这样的东西应该起作用:
int int_tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[numThreads];
int tNum[10];
int *parameters[numThreads];
for (int i = 0; i < numThreads; i++)
{
tNum[i] = i;
parameters[i] = new int(i);
hThread[i] = CreateThread(NULL, 0, helloFun, (void *)parameters[i], 0, NULL);
}
WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
for (int i = 0; i < numThreads; i++)
delete parameters[i];
return 0;
}
您必须在helloFun
中将lpParameter强制转换为int。
试试类似的东西:
const int maxThreads = 4;
DWORD WINAPI helloFun(LPVOID pArg)
{
int num = * (int*) pArg;
printf("Hello from Thread %dn", num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[maxThreads];
int tNum[maxThreads];
int numThreads = 0;
for (int i = 0; i < maxThreads; i++)
{
tNum[numThreads] = i+1;
hThread[numThreads] = CreateThread(NULL, 0, &helloFun, &tNum[numThreads], 0, NULL);
if (hThread[numThreads] == NULL)
{
printf("Unable to create a thread! Error: %un", GetLastError());
break;
}
++numThreads;
}
if (numThreads > 0)
{
WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
for (int i = 0; i < numThreads; i++)
CloseHandle(hThread[i]);
}
return 0;
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何从 CreateThread() 中加载的函数中获取返回值?
- 在类构造函数中将此指针传递给CreateThread在线程过程中的行为很奇怪
- 如何修改CreateThread函数
- 使用 WinSock2 开发,使用 CreateThread() 函数出错
- Windows内CreateThread类函数调用,指针引用崩溃
- 我如何传递一个对象到CreateThread函数