社区
进程/线程/DLL
帖子详情
windows多线程编程问题
icewind1_mm
2008-11-24 03:22:30
第一次问问题,希望大家帮忙哦!
我的程序是一个MFC基于对话框的多线程程序,线程是用来接收消息的,当接收到消息后,将数据添加到一个队列中(注:此队列封装在一个类中)然后通过置事件的方法激活一个线程,在这个线程中调用队列类的一个方法,将所有队列中的数据添加到数据库中。
问题是,有些时候,当收到消息时,能够将信息添加到队列中,但是不知道什么原因,执行的时候队列中就没有那个信息,或者事件无法触发。。。。
...全文
286
10
打赏
收藏
windows多线程编程问题
第一次问问题,希望大家帮忙哦! 我的程序是一个MFC基于对话框的多线程程序,线程是用来接收消息的,当接收到消息后,将数据添加到一个队列中(注:此队列封装在一个类中)然后通过置事件的方法激活一个线程,在这个线程中调用队列类的一个方法,将所有队列中的数据添加到数据库中。 问题是,有些时候,当收到消息时,能够将信息添加到队列中,但是不知道什么原因,执行的时候队列中就没有那个信息,或者事件无法触发。。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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试一试。
下载
多线程
编程
技术开发资料 高清完整PDF版
多线程
编程
技术开发资料.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权
问题
,请联系删除!
Windows
图形
编程
(pdf)
Windows
图形
编程
完全版
WPF
多线程
演示
WPF
多线程
演示
wpf下
多线程
的例子
wpf下
多线程
的例子
C#经典
编程
-220例
C#经典
编程
-220例 超经典的C#
编程
教程,免费下载
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章