这个问题很奇怪,希望大家帮助!
我做一个登录界面,由于登录时间过长,所以我在登录时用了一个线程,然后启动一个对话框,线程结束后,我关闭这个对话框,会出现问题,我把我的思路写一下,大家看有没有问题呢?
第一步、选择菜单上的登录按钮,然后进入登录的函数,弹出输入用户名及密码确定。
第二步、确定后,我启动一个线程,然后启动一个全局的对话框类。
第三步、线程结束后,我给这个全局对话框发送一个消息。
问题就出在第三步上,我发送完后,总会有问题出现,不知道为什么?
具体的代码,大家看一下
CMainFrame.h中
CDialog InfoDlg; CMainFrame.cpp中
void CMainFrame::OnConnect()
{
CDialog LonginDlg;//输入用用户名密码
if(LonginDlg.DoModal() == IDOK)
{
CreateThread();//启动登录线程//线程结束会发送一个成功的消息,会激活OnLonginSuccess函数
InfoDlg.DoModal();
}
} void CMainFrame::OnLonginSuccess()
{
if(LonginDlg.GetSafeHwnd() != NULL)
LonginDlg.SendMessage(WM_COMMAND,IDCANCEL,0); }
奇怪的问题来了,这样做,不是每次都有问题,当我启动一个定时器,时间设置为1毫秒的时候,错误的频率就高了,为什么会产生这样的问题呢
我做一个登录界面,由于登录时间过长,所以我在登录时用了一个线程,然后启动一个对话框,线程结束后,我关闭这个对话框,会出现问题,我把我的思路写一下,大家看有没有问题呢?
第一步、选择菜单上的登录按钮,然后进入登录的函数,弹出输入用户名及密码确定。
第二步、确定后,我启动一个线程,然后启动一个全局的对话框类。
第三步、线程结束后,我给这个全局对话框发送一个消息。
问题就出在第三步上,我发送完后,总会有问题出现,不知道为什么?
具体的代码,大家看一下
CMainFrame.h中
CDialog InfoDlg; CMainFrame.cpp中
void CMainFrame::OnConnect()
{
CDialog LonginDlg;//输入用用户名密码
if(LonginDlg.DoModal() == IDOK)
{
CreateThread();//启动登录线程//线程结束会发送一个成功的消息,会激活OnLonginSuccess函数
InfoDlg.DoModal();
}
} void CMainFrame::OnLonginSuccess()
{
if(LonginDlg.GetSafeHwnd() != NULL)
LonginDlg.SendMessage(WM_COMMAND,IDCANCEL,0); }
奇怪的问题来了,这样做,不是每次都有问题,当我启动一个定时器,时间设置为1毫秒的时候,错误的频率就高了,为什么会产生这样的问题呢
void CMainFrame::OnLonginSuccess()
{
if(InfoDlg.GetSafeHwnd() != NULL)
InfoDlg.SendMessage(WM_COMMAND,IDCANCEL,0);
}
还有就是错误提示的信息是
File : wincore.cpp
line: 3475 我知道这个应该不算是什么大的错误,如果在release下,肯定没问题,只有在debug下才会弹出的,如果我选择重试或者忽略都不会对程序产生什么影响,会继续正常运行的!但是我想让他在debug下也正常运行。
InfoDlg.SendMessage(WM_CLOSE,0,0);你这样用全局变量会有问题的,你发送消息关闭后,如果再次点击登陆,此时这个全局的InfoDlg已经被关闭销毁了。
InfoDlg.SendMessage(WM_CLOSE,0,0); 你这样用全局变量会有问题的,你发送消息关闭后,如果再次点击登陆,此时这个全局的InfoDlg已经被关闭销毁了。不会的,在第二次的时候,会在DoModal的时候重新那一个对话框的
你说的第二种方法,我可以试一下,不过,不知道,WaitForSinglObject会不会阻塞消息进程,要是阻塞了,那对话框中的进度条就会不好用了
试下非模式对话框,并在该对话框中加入一个更新登录进度的函数.
CMyApp::InitInstance()
{
g_wndMsg.Create() ;
g_wndMsg.CenterWindow() ;
g_wndMsg.SetMsg( "正在初使化主系统...",1) ;
g_wndMsg.ShowWindow(SW_SHOW);//
g_wndMsg.UpdateWindow();
//...后继的初使化过程调用g_wndMsg.SetMsg()设置初使化进度。因为是全局对话框,甚至到视图类的初使化函数中依然可调用.
}
CWelcomeDlg中:
//sMsg为当前操作步骤说明,nPer为当前完成百分比.nPer等于100时关闭对话框。
void SetMsg( const CString& sMsg, int nPer ) ;
{
if (msg.message == XXXXX)
/////
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
——这里试试PostMessage看,跨线程SendMessage可能会有问题的。每个窗口的消息应该在创建该窗口的线程中被处理。
这个地址我上了,也按照所说的进行了修改,还是有问题