用VC创建新线程易出的问题error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall

今天使用 CreateThread 方法创建线程遇到问题,后解决,记录下解决方案——

 

问题:

用VC创建新线程易出的问题error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

 

解决方案:

(1)如果线程要执行的是类的成员函数,则必须用static声明为静态函数  
  如:  
  class   echo  
  {  
        static   DWORD   WINAPI   ThreadFunc(LPVOID     pvoid)  
        ......  
        ......  
  }  
   
  (2)一般都是调用全局函数.

 

 

我们在用CreateThread(NULL,0,ThreadProc,NULL,0,NULL)创建线程得时候,此函数中需要新线程中的函数地址,我们常用的有两种方法解决:

    一.将我们要调用的新线程函数声明成DWORD WINAPI ThreadProc(lpvoid lpParameter)。

    二.我们可以将新线程函数声明成类中的成员函数:static DWORD WINAPI ThreadProc(lpvoid lpParameter)

    但是当我们的写法不正确的时候,往往会出现error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' 这个问题,另我们这些初学者很是恼火,现将可能出现的这种情况列举如下:

    第一种方法的使用是将新线程要处理的函数写在类外的一种的情况也就是全局函数,非类成员函数,需要注意的就是在创建新线程之前要声明该函数或定义函数,要注意这时不要在该类的头文件添加该函数的声明(我就犯过这样的错误)。记住用完要释放哦!

    第二种方法的使用是将新线程中要处理的函数定义成本类中的成员,使用时要注意一定要吧该函数声明成static类型的,否则就会报错error C2664。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用CreateThread函数创建线程,并在该线程中播放音乐,从而实现与主线程的同时运行。以下是示例代码: ``` #include <stdio.h> #include <windows.h> DWORD WINAPI PlayMusic(LPVOID lpParam); int main() { HANDLE hThread; DWORD dwThreadId; // 创建线程 hThread = CreateThread(NULL, 0, PlayMusic, NULL, 0, &dwThreadId); if(hThread == NULL) { printf("创建线程失败!\n"); return 1; } // 主线程继续执行其他任务 while(1) { printf("主线程在运行...\n"); Sleep(1000); } return 0; } DWORD WINAPI PlayMusic(LPVOID lpParam) { // 在线程中播放音乐 printf("线程在运行,开始播放音乐...\n"); Sleep(5000); // 假设播放音乐需要5秒钟 printf("音乐播放完成!\n"); return 0; } ``` ### 回答2: 要在C/C++程序中使用`CreateThread`函数创建线程来播放音乐,并且使主线程线程同时运行,可以按照以下步骤进行: 1. 引入相应的头文件和库:`windows.h`和`pthread.h`(如果是Unix系统)。 2. 编写主线程的代码,这个线程将负责程序的其他操作。同时,需要定义一个变量用于存储线程线程标识符。 3. 在主线程中使用`CreateThread`函数创建线程,在其中指定需要运行的函数作为参数。该函数将被线程调用来播放音乐。 4. 在音乐播放函数中,使用适当的音频库或API来播放音乐文件。这个函数将在线程中运行。 5. 调用`pthread_join`函数或其他等待函数,以等待线程的结束,确保主线程不会在线程结束之前终止。 下面是一个示例程序: ```c #include <stdio.h> #include <windows.h> // 引入Windows API头文件 #include <pthread.h> // 如果是Unix系统,引入此头文件 // 线程的入口函数 DWORD WINAPI PlayMusic(LPVOID lpParam) { // 使用适当的音频库或API来播放音乐文件 printf("线程播放音乐\n"); return 0; } int main() { HANDLE hThread; // 线程标识符 DWORD dwThread; // 线程ID,Windows系统使用DWORD类型 // 创建线程 hThread = CreateThread(NULL, 0, PlayMusic, NULL, 0, &dwThread); // 如果是Unix系统,使用pthread_create函数来创建线程 if (hThread == NULL) { // 处理线程创建失败的情况 printf("无法创建线程\n"); return 1; } // 主线程的其他操作 // 等待线程的结束 WaitForSingleObject(hThread, INFINITE); // 如果是Unix系统,可以使用pthread_join函数进行线程等待 return 0; } ``` 在这个示例中,`PlayMusic`函数是线程的入口函数,它将在线程中运行。在`main`函数中,首先创建线程,并进行了线程创建失败的检查。然后,在主线程的其他操作执行完后,调用`WaitForSingleObject`函数等待线程的结束。最后,程序返回主线程。 ### 回答3: 在C/C++程序中,可以使用`CreateThread`函数来创建线程,同时让主线程线程同时运行。要使用`CreateThread`函数来播放音乐,可以按照以下步骤操作: 1. 首先,在程序中包含头文件`windows.h`: ```c #include <windows.h> ``` 2. 接下来,使用`CreateThread`函数创建一个线程,用于播放音乐。指定一个函数名作为线程的入口点,并传递需要的参数。例如,假设我们有一个函数`playMusic`用于播放音乐: ```c DWORD WINAPI playMusic(LPVOID lpParam) { // 在这里编写播放音乐的代码.... return 0; } ``` 3. 在主函数中使用`CreateThread`函数创建线程,同时传递所需的参数。确保获取线程句柄以便稍后对线程进行控制: ```c int main() { // 其他主线程的代码.... // 创建线程,并传递所需的参数 HANDLE hThread = CreateThread(NULL, 0, playMusic, NULL, 0, NULL); if (hThread == NULL) { // 线程创建失败,处理错误 return 1; } // 其他主线程的代码.... // 等待线程的结束 WaitForSingleObject(hThread, INFINITE); // 关闭线程句柄 CloseHandle(hThread); return 0; } ``` 通过上述步骤,我们可以在C/C++程序中使用`CreateThread`函数创建一个线程来播放音乐,同时保持主线程线程的运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值