如何在hello world程序中添加一个线程,让显示窗口的同时做另外一件事?

来源:百度知道 编辑:UC知道 时间:2024/06/23 16:37:50
用vc编的hello world 程序,在运行中我希望它干另外一件事情,比如在创建窗口的时候就开始一直唱一首歌,可是这样的话原来那个窗口就接受不到任何消息了!连最小化都不行了!
为实现这个功能,又不影响窗口操作,可能就是添加线程吧,如何做啊?是不是用CreateThread()这个函数?如何用 请各位高手赐教!
YoungSoft :提示错误
“CreateThread” : 不能将参数 3 从“DWORD (LPVOID)”转换为“LPTHREAD_START_ROUTINE” 为何啊?
还有 像本题情况一般是在主函数离开线程还是在窗口处理函数中开线程

你是在用PlaySound吗?要是这样的话,只要将最后一个参数|上SND_ASYNC就OK了。
如:
PlaySound(fileName, NULL, SND_LOOP|SND_ASYNC);

如果不是,一定要加个线程的话,例子如下:
/////////////////////////////////////////////////
//例子开始

DWORD MusicThread(LPVOID pParam)
{
//在这里播放音乐。。。
.....
}

然后在你想要播放音乐的地方:
....

CreateThread(NULL, 0, MusicThread, NULL, 0, NULL);

//例子结束
//////////////////////////////////
看看是不是你想要的。

线程分工作者线程和界面线程(实际上是一样的,只不过界面线程有消息栈,不过通过合适的操作工作者线程也可以有消息栈)

创建线程有多种方式,即可以通过好几个函数调用来创建一个线程,(但在内核操作是一样的)。
MFC下可以使用AfxBeginThread 函数来创建一个线程,它有2个重载,一个是创建工作者,一个是界面。工作者线程主要传入一个标准的执行函数,界面线程传入一个CWinThread指针(一般类似于你创建工程的CxxxApp类)。具体操作看MSDN

当然,你也可以使用 CreateThread 来创建线程,不过这样只能创建工作者线程。实际上界面线程创建内部也是调用的这个函数,只不过界面线程的执行主函数体是一个循环,不断的读消息,取消息而已。这也就是唯一的工作者和界面线程的区别而已

事实上要想播放音乐而不耽误界面的操作,只要在播放音乐时选择后台播放即可(参数控制)。

如果不是要放音乐而是做其他事情,那就要创建线程了,使用AfxBeginThread或者CraeteThread都可以。