[程序][界面][老死]我一个MFC的程序为什么界面老死掉
09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »
一个线程死循环,(10秒间隔)不停的读数据库
启动后,界面就卡死在那里
怎么搞
//查询看有新的数据添加进去没有
UINT SqlThreadProc(LPVOID param){
CString cid;
CString msql="update emd_message set STATUS_FLAG =1 where command_id = ";
CLog log;
CDataBase dbs;
dbs.getConn();
CClient client;
char* locoMess;
while(TRUE){
Sleep(5000);
try{
dbs.getRec();
dbs.pRec->Open("select command_id as cid,command_data as cd from emd_message where STATUS_FLAG =0",
dbs.pConn.GetInterfacePtr(), //获得库连库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText
);
_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){
cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);
client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
dbs.closeRec();
}catch(_com_error &e){
log.log("SqlThreadProc");
log.log(e.ErrorMessage());
}
}
return 0;
}
//查询看有新的数据添加进去没有
UINT SqlThreadProc(LPVOID param){
CString cid;
CString msql="update emd_message set STATUS_FLAG =1 where command_id = ";
CLog log;
CDataBase dbs;
dbs.getConn();
CClient client;
char* locoMess;
while(TRUE){
Sleep(5000);
try{
dbs.getRec();
dbs.pRec->Open("select command_id as cid,command_data as cd from emd_message where STATUS_FLAG =0",
dbs.pConn.GetInterfacePtr(), //获得库连库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText
);
_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){
cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);
client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
dbs.closeRec();
}catch(_com_error &e){
log.log("SqlThreadProc");
log.log(e.ErrorMessage());
}
}
return 0;
}
//查询看有新的数据添加进去没有
UINT SqlThreadProc(LPVOID param){
CString cid;
CString msql="update emd_message set STATUS_FLAG =1 where command_id = ";
CLog log;
CDataBase dbs;
dbs.getConn();
CClient client;
char* locoMess;
while(TRUE){
Sleep(5000);
try{
dbs.getRec();
dbs.pRec->Open("select command_id as cid,command_data as cd from emd_message where STATUS_FLAG =0",
dbs.pConn.GetInterfacePtr(), //获得库连库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText
);
_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){
cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);
client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
dbs.closeRec();
}catch(_com_error &e){
log.log("SqlThreadProc");
log.log(e.ErrorMessage());
}
}
return 0;
}
主线程同时都做哪些事?界面是自己绘制的吗?如果不启动工作线程会不会有问题?
_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){
Sleep(0); // 加上试试
cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);
client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
你是不是在主线程加了类似WaitForSingleObject(hThread, INFINITE);的语句啊
死锁
Sleep(0); // 加上试试
加上了,好了
LSD可以说说原因不
显然主界面线程没有执行消息循环,在其他地方就已经阻塞了
Sleep(0);
释放该线程时间片给界面线程,用于处理界面响应。
[对话][程序][依次]MFC对话框程序是如何依次执行的
09月 16th, 2008 by admin
Posted in VC/MFC | No Comments »
MFC对话框程序建立后,主要包含::OnInitDialog(),::OnPaint(),::OnQueryDragIcon()等。
1.如果我想一运行程序就自动执行某个函数,是不是要把这个函数放在OnPaint()里?
2.我这样试了一下,好像OnPaint不停再画,导致我想执行的函数不停的再执行,如果我就想执行一遍,该怎么办?
立即执行放OnInitDialog
延时重复执行放OnTimer
appOnInit
OnInitDialog
放在OnInitDialog
…
我一开始也是向大家说的,放在OnInitial里面。不过出现了问题,我把代码贴出来一些,大家帮着看看:
BOOL CDelayStabilityDlg::OnInitDialog()
{
CDataDisplay_BaseDlg::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
/*下面是我要运行的程序*/
CDataDisplay_BaseDlg::abc();
return;
}
void CDataDisplay_BaseDlg::abc()
{
MessageBox("123");
}
意思就是说我要运行的程序,是我定义在CDelayStabilityDlg这个类里面的另一个成员函数。如果我直接在OnInitDialog
里面运行,会弹出那个窗口(终止、重试、取消)。如果放在OnPaint里面就没事。是不是因为OnInitDialog 这个函数执行的时候,窗口还没有被创建,里面的成员函数还不能用?
我又试了试,放在OnInitial里面可以了,谢谢大家,散分了
[问下][程序][提交]问下,如何写程序提交网页表单.
09月 14th, 2008 by admin
Posted in VC/MFC | No Comments »
登陆网站后发帖子一般学登录,我登录后发帖子就没有限制了.
请问如何写个程序,手动登录后让程序自己发帖子.
谢谢了.麻烦指导下.
学习一下。
为什么http://www.blogger.com/home
页面点击http://www.blogger.com/posts.g?blogID=380256887722088739
后就能连接到编辑文章的窗口,但是如果右键另窗体打开就要提示登录啊?
问题就是如何把http://www.blogger.com/home窗口的session或cookie
获取后放到另一个窗体使用啊.
[使用][程序][测试]DLL中使用DAO在MFC程序中测试通过WIN32程序中却提示CDaoException
09月 13th, 2008 by admin
Posted in VC/MFC | No Comments »
由于dll中有使用DAO建立access数据库,所以DLL使用MFCDLL的模板做的使用动态mfc的规则dll。可是这个程序在MFC程序运行正常,在我机器上的win32程序中调用也正常,转移到其他机器上就提示CDaoException。可是我在调试dll时都是能正确执行的,调用完dll退出程序return 0时会弹出一个输入crt0.c路径的提示。dll要实现的建立数据库导入数据功能,查找文件夹下相应的mdb文件和输入内容也是可以正确导入的。网上说出现这错误可能是调用dll后资源没被释放的缘故,msdn上关于dll中使用dao的说明中提到尽量使用动态分配空间,在AfxDaoTerm之前释放已经分配空间。我将代码检查过动态分配的空间也都在退出前删除了。请各位达人指教一下,我已经在这问题上纠结了4,5天了。
执行DAO操作的地方都设置了try catch可是都未捕获到异常。
调试的时候也只是在调用完DLL后主程序退出时发生错误
现在基本定位出错原因了。。。
会出现CDaoException是因为在create或open时CDaoDatabase调用了AfxDaoInit出错。。。
不过还是不清楚为什么在dll里这样调用会出错。。。
debug错误信息是First-chance exception in dlltest.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
这应该是编译器捕获了异常处理了,所以在我机子上它还是能正常运行。可是有些机器编译器捕获到了异常却没处理就导致程序出错了。
哎,到底怎么改啊。。
MSDN上有一篇Your application may fail with an "Access Violation" error message when you use ODBC or DAO in the InitInstance or DLLMain functions of a DLL的文章
好像是说dll里创建了线程会出错啥的,不知道我出错的跟这是不是一样呢。
[CAsyncSocket][发送][程序]CAsyncSocket 简单的发送接受程序,可是为什么接受不到数据啊
09月 13th, 2008 by admin
Posted in VC/MFC | No Comments »
这是继承的类:
void CSOCK::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
((CQ2Dlg *)m_Pwnd)->OnReceive();
CAsyncSocket::OnReceive(nErrorCode);
}
void CSOCK::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
((CQ2Dlg *)m_Pwnd)->OnSend();
CAsyncSocket::OnSend(nErrorCode);
}
void CSOCK::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
((CQ2Dlg *)m_Pwnd)->OnAccept();
CAsyncSocket::OnAccept(nErrorCode);
}
void CSOCK::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
((CQ2Dlg *)m_Pwnd)->OnClose();
CAsyncSocket::OnClose(nErrorCode);
}
void CSOCK::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
((CQ2Dlg *)m_Pwnd)->OnConnect();
CAsyncSocket::OnConnect(nErrorCode);
}
void CSOCK::GetParent(CDialog *pWnd)
{
m_Pwnd = pWnd;
}
这是在主对话框实现的:
BOOL CQ2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About…" menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_type=0;
m_ip="127.0.0.1";
m_du=6000;
UpdateData(false);
m_ServerSocket.GetParent(this);
m_ClientSocket.GetParent(this);
return TRUE; // return TRUE unless you set the focus to a control
}
void CQ2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CQ2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CQ2Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//DEL void CQ2Dlg::OnButton2()
//DEL {
//DEL // TODO: Add your control notification handler code here
//DEL
//DEL
//DEL
//DEL }
void CQ2Dlg::OnBUTTONlink()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_type==0)
{
m_ServerSocket.Create(m_du);
m_ServerSocket.Listen();
MessageBox("Server Ok");
}
else
{
m_ClientSocket.Create();
m_ClientSocket.Connect(m_ip,m_du);
MessageBox("Client Ok");
}
}
void CQ2Dlg::OnConnect()
{
}
void CQ2Dlg::OnAccept()
{
m_ServerSocket.Accept(m_ClientSocket);
}
void CQ2Dlg::OnReceive()
{
char * buf=new char[100];
int len=100;
m_ClientSocket.Receive(buf,len);
m_recv=buf;
UpdateData(false);
}
void CQ2Dlg::OnClose()
{
//m_ClientSocket.OnClose();
}
void CQ2Dlg::OnSend()
{
}
void CQ2Dlg::OnBUTTSEnd()
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_ClientSocket.Send((LPCTSTR)m_send,m_send.GetLength());
MessageBox(m_send);
}
编译也没错误就是接受不到数据。
是的啊!
到底是为什么啊?
调用一下AsyncSelect();选择你需要的事件。
[程序][通过][网络]程序怎么通过网络进行通讯
09月 12th, 2008 by admin
Posted in VC/MFC | No Comments »
程序A和程序B是两个程序, 怎么让程序A发送一个命令或消息,通过局域网程序B接收消息并执行操作?(告诉我怎么发送消息和接收消息就好了)
刚接触这个,不只到如何实现..
socket
给点资料啊
http://www.vckbase.com/document/listdoc.asp?mclsid=9
socket通信 网上代码很多的http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=905
建议楼主看看孙鑫VC++教学视频中
关于Socket的介绍
边做实例边讲解 讲得很好
我就是看孙鑫老师的视频入门的
具体忘了第几课了 好像是第14课吧
同意,我也看过,入门不错
[何在][字节][程序]如何在多字节程序中输出特殊字符(如平方米)
09月 8th, 2008 by admin
Posted in VC/MFC | No Comments »
如题
需要在Edit 或者 ListView 中输出
不用 UniCode 的支持
特殊对待吧,比如中文字库里:ASC编码178(0xB2):ⲯ79(0xB3):ⳣ¼/td>
路过学习。帮你顶
直接赋值就可以吧
多字节中文里面没有这些字符,不用Unicode没法表示。
[程序][链接][smtp]为什么我在程序中链接smtp服务器不成功
09月 7th, 2008 by admin
Posted in VC/MFC | No Comments »
socket返回10061,如题,谢谢。
那我要和smtp服务器连接应该怎么办啊?
为什么邮箱客户端就可以呢?
我应该如何实现一个邮箱客户端?
自己去解析smtp包体。
首先到网上搜一份SMTP协议的介绍。
然后用telnet手动连接服务器演练一下。
最后才着手编程。
你确定你使用的端口对吗?如果邮件客户端可以,你的也应该可以。
公司的邮箱,25端口,没错阿
端口要搞对
连接上smtp服务器后,立即应答
HELO
AUTH LOGIN
MAIL FROM:….
如果使用了SSL
那么机制又不同
连接www.126.com的也不可以
up
[退出][程序][完全]请教了:在退出程序时,完全杀掉死锁的子线程..
09月 7th, 2008 by admin
Posted in VC/MFC | No Comments »
作了个子线程,循环查询底层接口,在完全退出程序后,可能是子线程死锁了
发现还驻留在内存里,像这种情况,如何退出程序时,不管子线程死锁了能安全删除他,……..
UINT WorkThreadProc(LPVOID lParam);
UINT WorkThreadProc(LPVOID lParam) //工作主线程
{
if(lParam == NULL) return -1;
CAdDlg* pDlg = (CAdDlg*)lParam;
while(TRUE)
{
Hardware.MainCircle(); //底层类的方法
Sleep(0);
}
delete pDlg;
return 0;
}
void CHardware::MainCircle(void)
{
………….
}
1、记录该线程的句柄,在程序退出时关闭该线程
?用 PostMessage(hwnd, WM_CLOSE, 0, 0); 不行
2、在主框架类中,添加一个BOOL型的控制变量,用来控制该线程
?UINT WorkThreadProc(LPVOID lParam); 想我这样用API的线程如何改进?
谢谢!
用ExitProcess退出程序.
用ExitProcess退出程序.
?"ExitProcess"没有用过不知道用法,有例子否?谢谢!
while(TRUE)这里可以设个判断,比如while(bExit != TRUE)
然后在外部把bExit设为TRUE就结束循环,退出线程
void CAdDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
ExitProcess(0); //任意加了个0
CDialog::OnClose();
}
已经可以退出了,不驻留内存了…不会产生不安全性吗?
void ExitProcess(UINT uExitCode);
其参数uExitCode为进程设置了退出代码。该函数具有强制性,在执行完毕后进程即被结束,因此位于其后的任何代码将不能被执行。虽然ExitProcess()函数可以在结束进程的同时通知与其关联的动态链接库,但是由于它的这种执行的强制性,使得ExitProcess()函数在使用上将存在有安全隐患。例如,如果在程序调用ExitProcess()函数之前曾用new操作符申请过一段空间,那么将会由于ExitProcess()函数的强制性而无法通过delete操作符将其释放,从而造成内存泄露。有鉴于ExitProcess()函数的强制性和不安全性,在使用时一定要引起注意。
TerminateThread可以强制退出线程.
BOOL TerminateThread(
HANDLE hThread, // handle to thread
DWORD dwExitCode // exit code
);
像我这样用API产生的线程如何,取得该线程的句柄?
你用那个CreateThread的话返回值就是.要是_beginthreadex的话,返回值强制转化成HANDLE就是
你这个主要要看你的线程是不是被组塞,如果一直有阻塞任务,那就很难说,可能是程序本身设计问题了。
TerminateThread 这个可以终止,但不会释放资源,会有问题。
[编写][程序][方式]VC编写程序用两种方式的异同
09月 6th, 2008 by admin
Posted in VC/MFC | No Comments »
VC编写程序用两种方式的异同:
用VC编写程序有两种方式:1.Windows SDK 的C语言方式2.利用MFC的C++方式
那么他们的异同是什么???
http://blog.donews.com/yifan/archive/2004/11/26/183788.aspx
C语言方式和C++方式是什么意思?
首先
1.Windows SDK 的C语言方式
SDK也可以有C++
这种方式要写很多代码,出来的程序机器代码小,效率高点,少了很多判断,因为很多判断你可以自行决定是否加入.而MFC为了支持其庞大系统的安全运行,就额外加了很多负担.
2.利用MFC的C++方式
构造程序快速,管理方便.但出来的机器代码要大,效率相对慢点,但也要额外学很多MFC的类.和他们的使用