CREATETHREAD第一个参数报错,createthread函数
C语言 createthread 传递参数出错
CreateThread 会创建一个新的线程,这个线程执行输出之前,主线程里的i可能继续增加。
而你传过去的参数是一个地址,所以其指向的值也会变。
也就是说,printf之前,主线程里的for循环可能已经结束了,这时i=10。这就意味着,你传给每一个线程的参数所指向的内存都变成了10。
用CreateThread一个有多个线程的MFC里添加一个新的线程,线程函数里的函数的参数都不正确是为什么?
TimeThreadFunc的参数lpParam强制转换为HWND类型,送到SetTimer的第一个参数:
DWORD WINAPI TimeThreadFunc(LPVOID lpParam)
{
SetTimer((HWND) lpParam, 1,10000,0);
}
然后创建线程的时候把当前窗口句柄搞进去
HANDLE hThread5=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)TimeThreadFunc, (LPVOID)GetSafeHwnd(),0,NULL);
(C++多线程问题)CreateThread()函数问题
一、Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。
二、CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:
1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回
2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1
3.分配context结构
4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD
5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数
6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数
三、MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)
processthreadsapi.h中CreateThread原型:
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateThread(
_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_SIZE_T dwStackSize,
_In_LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt___drv_aliasesMemLPVOID lpParameter,
_In_DWORD dwCreationFlags,
_Out_opt_LPDWORD lpThreadId
);
四、示例:
C 语言 WIN32编程问题。
1. teststruct[j] 改为teststruct 不需要数组,而且前面定义的是指针,这里也不能用成数组;
2 HANDLE hThread = (HANDLE)malloc(sizeof(HANDLE)); 改为HANDLE hThread[10]; 不需要分配;因此后面的free(hThread); 删除;
3. CreateThread函数 参数错误 应为
hThread[j] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,(LPVOID)teststruct,0,NULL); 第三个参数为线程函数指针,第四个参数为传进去的线程函数的参数;
4.CreateThread 之后关闭句柄 CloseHandle(hThread[j]); 就不需要后面的
for(;j =0;j--)
{
CloseHandle(hThread[j]);
}
5。 紧接着 Sleep(1); 睡眠1毫秒,使得能够进入线程函数ThreadFunc;
6。 printf("TEST1 All Thread has Finished\n"!);
printf("TEST2 Finished\n"!);
麻烦你把 感叹号放到 引号 里面去!!
7. MyFunc(teststruct[j]); 改为 MyFunc(teststruct); 不存在数组
-------------------------------------------
TESTSTRUCT 有多少个由你的循环决定啊,因为线程句柄hThread 是一个数组,
每个线程函数处理一个TESTSTRUCT,而且你的TESTSTRUCT在j++后面重新分配了啊
所以不需要TESTSTRUCT[j]
反正我在电脑上修改 通过了的