windows多线程编程问题

icewind1_mm 2008-11-24 03:22:30
第一次问问题,希望大家帮忙哦!
我的程序是一个MFC基于对话框的多线程程序,线程是用来接收消息的,当接收到消息后,将数据添加到一个队列中(注:此队列封装在一个类中)然后通过置事件的方法激活一个线程,在这个线程中调用队列类的一个方法,将所有队列中的数据添加到数据库中。
问题是,有些时候,当收到消息时,能够将信息添加到队列中,但是不知道什么原因,执行的时候队列中就没有那个信息,或者事件无法触发。。。。
...全文
282 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenjing09525 2010-07-03
  • 打赏
  • 举报
回复
...
e_sharp 2008-12-13
  • 打赏
  • 举报
回复
UP
li_guotao 2008-12-13
  • 打赏
  • 举报
回复
HANDLE m_hEventUpdate = NULL; //更新事件句柄
HANDLE m_hEventExit = NULL; //退出事件句柄
HANDLE m_hThread = NULL; //线程句柄
DWORD m_nThreadId = 0; //线程ID

//声明
static DWORD WINAPI ThreadProc(LPVOID lpParameter)

LRESULT CDemoDlg::StartThread()
{

//创建线程
m_hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)this, 0, &m_nThreadId);
if(m_hThread == NULL)
return E_FAIL;

return S_OK;
}

//线程回调函数
DWORD WINAPI CDemoDlg::ThreadProc(LPVOID lpParameter)
{
CWndA *pWnd = (CWndA *)lpParameter;
//pWnd就是你的对话框指针,可以进行相关操作.
::SendMessage( pWnd->m_hWnd, WM_COMMAND, 0, 0 ); //或者自己定义的消息

return 0;
}
ethan_yang 2008-12-02
  • 打赏
  • 举报
回复
PostThreadMessage(...)
icewind1_mm 2008-12-01
  • 打赏
  • 举报
回复
类中程序大体操作如下。
假设我的临界区变量定义为:
CRITICAL_SECTION m_CritSect;
//
在Add(CString& strNr)方法中
void CQueue4Db::Add(CString& strNr)
{
EnterCriticalSection(&m_CritSect );
m_pTail->strNr = strNr;
LeaveCriticalSection(&m_CritSect );
m_pTail = pTail->Next;
}
这样临界区不管用吗?


KevinJHoo 2008-11-30
  • 打赏
  • 举报
回复
并没有保护好队列是中的记录。
KevinJHoo 2008-11-30
  • 打赏
  • 举报
回复
楼主看看,是不是添加与执行的时候,队列中的操作使用临界区不对
icewind1_mm 2008-11-27
  • 打赏
  • 举报
回复
程序中没有用发送消息。
代码太多了主要是在线程中处理的内容比较多,没法帖。
那我再说的具体点吧。
这是一个传输文件的程序,客户端在服务器注册一个回调函数,用来接收服务器端发送来的消息,服务器端是一个服务。
在回调函数中,服务器会把发送或者接收文件的信息返回给客户端,回调函数中如果直接用ado执行sql语句更新数据库就没问题,可是如果用先入队再出发事件,让一个线程去从队列中取更新语句在更改数据库时,就会发现有些时候更改数据库线程中的事件无法被触发,或者莫名的会在队列中没有要更新的语句(队列是个循环队列,长度600)。。。
之后我将队列和执行sql语句的操作封装到一个类中(class CQueue4Db:CObject),类中主要包Add()和Exec()两个方法,前者用来入队,后者用来更新数据库。类中封装了一个临界区,在添加节点和从节点中取数据时保护数据,析构时删除。
线程用WaitForSingleObject()方法等待事件触发,一旦触发就执行Exec()方法去更新数据库。

谢谢楼上两位的提醒^_^
caixingxin 2008-11-24
  • 打赏
  • 举报
回复
把代码帖出来才好说话。。
沧海一朵浪 2008-11-24
  • 打赏
  • 举报
回复
不要用postmessage用sendmessage试一试。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧