导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

CreateThread创建多线程时窗口一闪就没了?

逗比汪星人 2009-08-05 08:29:52
我在SDK代码插入一个对话框资源,WinMain函数用线程创建对话框时,怎么窗口一闪就没了~~

下面是SDK.cpp所有的代码:

//////////////////////////////////////////////////////////////////////////
// SDK.cpp
// SDK线程创建对话框实例

#include <windows.h>
#include "Resource.h"

//////////////////////////////////////////////////////////////////////////
// 线程函数、对话框回调函数
DWORD WINAPI ThreadProc(LPVOID lpParameter);
LRESULT CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

// 全局变量:实例句柄、窗口句柄
HINSTANCE hCurInstance = NULL;
HWND hWnd = NULL;

/************************************************************************/
/* 函数说明:WinMain函数
/************************************************************************/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
hCurInstance = hInstance;
DWORD dwThread;
CreateThread(NULL,0,ThreadProc,NULL,0,&dwThread);

Sleep(100);
return 0;
}

/************************************************************************/
/* 函数说明:线程函数、用来创建对话框
/* 参 数:LPVOID
/* 返 回 值:msg.wParam
/************************************************************************/
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
if(DialogBox(NULL,MAKEINTRESOURCE(IDD_DIALOG_DIALOG),NULL,(DLGPROC)DialogProc) == IDOK)
return 0;
}

/************************************************************************/
/* 函数说明:窗口回调函数
/* 参 数:消息处理
/* 返 回 值:msg.wParam
/************************************************************************/
LRESULT CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:
PostQuitMessage(0);
break;
case IDOK:
break;
default:
break;
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return FALSE;
}


资源文件源码就不用贴了吧,我是将MFC对话框资源文件COPY过来的~~
...全文
245 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
虫爷 2010-05-04
看一下怎么搞的!
回复
雪影 2009-08-05
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
hCurInstance = hInstance;
DWORD dwThread;
CreateThread(NULL,0,ThreadProc,NULL,0,&dwThread);
WaitForSingleObject(hThread,INFINITE);
return 0;
}
回复
逗比汪星人 2009-08-05
dwMilliseconds
[in] Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.


谢谢老大们啊!

原来我把MSDN上第二参数的最后一句话我看漏了,郁闷!

结贴去了!
回复
bigriverhorse 2009-08-05
其实楼主已经知道WaitForSingleObject了,也就是第二个参数,

此参数为0代表立刻返回,不等待
此参数为INFINITE代表无穷等待
回复
zoulie 2009-08-05
CreateEvent创建一个事件,
线程里面改变事件为有信号,
主线程里面等待该事件
回复
逗比汪星人 2009-08-05
我想通过内核对象,让主线程A来等待线程B结束后再结束,该怎么写代码?
回复
Ghost90 2009-08-05
落了一句对

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
hCurInstance = hInstance;
DWORD dwThread;
UINT i=DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG_DIALOG),0,DialogProc,0);
ExitProcess(i);

return 0;
}

回复
逗比汪星人 2009-08-05
[Quote=引用 1 楼 dch4890164 的回复:]
主线程已经退出,其所有资源都将被系统回收,也包括你要弹出得那个对话框
C/C++ codeint WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd )
{
hCurInstance= hInstance;
DWORD dwThread;
HANDLE hThread= CreateThread(NULL,0,ThreadProc,NULL,0,&dwThread);
WaitForSingleObject(hThread);
Sleep(100);return0;
}
试验一下
[/Quote]

WaitForSingleObject第二个参数是休眠等待时间,如果设定为3000毫秒,那么3秒后也会自动消失啊??
回复
Ghost90 2009-08-05
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
hCurInstance = hInstance;
DWORD dwThread;
DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG_DIALOG),0,DialogProc,0);

return 0;
}


创建对话框的方式不对
回复
zoulie 2009-08-05
WinMain执行return 0后,会调用ExitProcess结束进程,所以线程也就没有了,
方法参照楼上的,等待线程返回
回复
flyoxs 2009-08-05
你的WinMain函数在创建线程后100毫秒就退出了!进程都退出了,线程还能活么?

CreateThread(NULL,0,ThreadProc,NULL,0,&dwThread);
Sleep(100);
return 0;

你的线程函数也是如此,急急忙忙就return了,当然一闪而过。
回复
dch4890164 2009-08-05
主线程已经退出,其所有资源都将被系统回收,也包括你要弹出得那个对话框

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
hCurInstance = hInstance;
DWORD dwThread;
HANDLE hThread = CreateThread(NULL,0,ThreadProc,NULL,0,&dwThread);
WaitForSingleObject(hThread);
Sleep(100);
return 0;
}



试验一下
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……