[程序][界面][老死]我一个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);

释放该线程时间片给界面线程,用于处理界面响应。

Tags: , , ,

[对话][程序][依次]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

引用 1 楼 sjdev 的回复:
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里面可以了,谢谢大家,散分了

Tags: , , ,

[问下][程序][提交]问下,如何写程序提交网页表单.

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
获取后放到另一个窗体使用啊.

Tags: , , ,

[使用][程序][测试]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天了。

引用 1 楼 tabby 的回复:
用try捕获了异常吗?显示的异常内容是什么??

执行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里创建了线程会出错啥的,不知道我出错的跟这是不是一样呢。

Tags: , , ,

[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();选择你需要的事件。

Tags: , , ,

[程序][通过][网络]程序怎么通过网络进行通讯

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课吧

引用 6 楼 FireBirdCN 的回复:
建议楼主看看孙鑫VC++教学视频中
关于Socket的介绍
边做实例边讲解 讲得很好
我就是看孙鑫老师的视频入门的
具体忘了第几课了 好像是第14课吧

同意,我也看过,入门不错

Tags: , , ,

[何在][字节][程序]如何在多字节程序中输出特殊字符(如平方米)

09月 8th, 2008 by admin
Posted in VC/MFC | No Comments »

如题

需要在Edit 或者 ListView 中输出

不用 UniCode 的支持

特殊对待吧,比如中文字库里:ASC编码178(0xB2):ⲯ𜛱79(0xB3):ⳣ¼/td>

路过学习。帮你顶

直接赋值就可以吧

多字节中文里面没有这些字符,不用Unicode没法表示。

Tags: , , ,

[程序][链接][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

Tags: , , ,

[退出][程序][完全]请教了:在退出程序时,完全杀掉死锁的子线程..

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 这个可以终止,但不会释放资源,会有问题。

Tags: , , ,

[编写][程序][方式]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的类.和他们的使用

Tags: , , ,