CREATETHREAD第一个参数报错,createthread函数

http://www.itjxue.com  2023-01-20 00:45  来源:未知  点击次数: 

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]

反正我在电脑上修改 通过了的

(责任编辑:IT教学网)

更多

推荐浏览下载文章