社区
进程/线程/DLL
帖子详情
我的多线程程序:主线程每接收到一个完整的数据包,就启动一个ADO线程.(只用一个连接)
temp
2001-05-10 04:00:00
我打算监视线程从串口每接收到一个数据,发个消息给主线程,
主线程每接收到一个完整的数据包,就启动一个ADO线程,
ADO线程查询后向串口回送命令,怎么样?
(已调通,但不知道有何缺陷)
...全文
189
18
打赏
收藏
我的多线程程序:主线程每接收到一个完整的数据包,就启动一个ADO线程.(只用一个连接)
我打算监视线程从串口每接收到一个数据,发个消息给主线程, 主线程每接收到一个完整的数据包,就启动一个ADO线程, ADO线程查询后向串口回送命令,怎么样? (已调通,但不知道有何缺陷)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
temp
2001-06-16
打赏
举报
回复
谢谢Kevin_qing(Kevin) !
Kevin_qing
2001-06-13
打赏
举报
回复
多线程下面调用API释不会有冲突的,但是如果是调用C/C++函数就有可能。
比如你同时有两个线程读/写同一个文件。。。
所以应该有同步策略
temp
2001-06-13
打赏
举报
回复
<<但创建线程要耗费资源
创建一个线程要耗费多大资源?
ximuwa
2001-06-02
打赏
举报
回复
Kevin_qing(Kevin) :
你的意思是不是多线程下调用api可能会冲突??
Kevin_qing
2001-05-18
打赏
举报
回复
2.因为C/C++库函数本来是为单线程使用的,所以使用了比较多的局部静态变量,而在多线程下面调用会有冲突。
而VC提供了_beginthread()函数就是为了对每个线程做这些静态变量的处理(同步或者是线程独立了)。所以应该使用_beginthread();
当然如果你确信你使用的库函数没有这些问题还是可以用CreateThread的。
3.
用waitforsingleobject()同步好了,至于第二个方法是起不到同步的作用的。
因为可能同时有两个AdoThread()在运行,而这个时候receivestr已经被置空了。
另外 if(receivestr!="")判断有问题。用strcmp函数来比较字符串
conqueror
2001-05-17
打赏
举报
回复
如果每收到一个数据包就起一个线程有点太浪费,要知道同一进程的线程虽然共享资源,但创建线程要耗费资源,线程间切换也是要耗费资源的,如果线程起的太多,cpu大多数时间花在环境切换上那就不爽了,你可以在一开始就创建一个被挂起的线程,每当收到一个完整的数据包唤醒它,处理完数据,再将其挂起,不是更好一些吗?
temp
2001-05-17
打赏
举报
回复
注意回送命令时,写串口要考虑同步。不能两个线程同时写串口。
zheng_rui
2001-05-17
打赏
举报
回复
用但县城多好,何必呢?????????住县城纯粹多余,ado 的m_Connection真能跨县城?????
Kevin_qing
2001-05-17
打赏
举报
回复
这个东西有必要用多线程吗?
简直是画蛇添足
BlowG
2001-05-17
打赏
举报
回复
最好串口的操作由一个县城来干。
temp
2001-05-17
打赏
举报
回复
To Kevin_qing(Kevin)
(1)
我已经改成了
::CreateThread(NULL,0,ThreadProc,0,0,NULL);
因为dwado本来就没什么用处。
(2)为什么CreateThread()不安全?
(3)
准备加入waitforsingleobject()怎么样?
或者:加入
While(1)
{
if(receivestr!="")
continue;
else break;
}
你看如何?
xyzboat
2001-05-17
打赏
举报
回复
To Kevin_qing(Kevin):
讲的好.
xyzboat
2001-05-17
打赏
举报
回复
/
Kevin_qing(Kevin) . \/
xyzboat
2001-05-17
打赏
举报
回复
/
Kevin_qing(Kevin) . \/
Kevin_qing
2001-05-17
打赏
举报
回复
不是说用线程不好,关键是看有没有必要。
看看你的程序:
1。
CreateThread(NULL,0,AdoThread,0,0,&dwado);
这里有问题,本意是把dwado当参数传给 AdoThread,可是dwado的值不能维持。
可能在AdoThread拿到&dwado时,该地址的值已经改变。
所以这里要么需要同步,要么用其他的方法传值。
改为
CreateThread(NULL,0,AdoThread,0,0,dwado);
2。CreateThread函数不安全,建议改为
_beginthread();
3。...
m_port.WriteToPort(replystr);/*回送命令字符*/
会有冲突。
建议增加一个同步对象
temp
2001-05-17
打赏
举报
回复
<<最好串口的操作由一个县城来干。
为什么?
<<ado 的m_Connection真能跨县城?
我试过呀。可以。
<<如果线程起的太多,cpu大多数时间花在环境切换上那就不爽了
不会太多,一个进程里有7-8个线程总没问题吧。
temp
2001-05-10
打赏
举报
回复
请诸位大虾看看:我这么干有问题吗?
temp
2001-05-10
打赏
举报
回复
部分代码:
_ConnectionPtr m_pConnection;
bool m_fInitialized;
DWORD dwmain;
DWORD dwado;
DWORD WINAPI mainThread(void* p);
DWORD WINAPI AdoThread(void* p);
CSerialPort m_port;
CString receivestr;
CString replystr;
main()
{
... ...
if (FAILED(CoInitialize(NULL)))
m_fInitialized=TRUE;
HRESULT hr;
/*ADO连接数据库*/
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");/*创建Connection对象*/
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);
}
}
catch(_com_error e)/*捕捉异常*/
{
... ...
return FALSE;
}
CreateThread(NULL,0,ThreadProc,0,0,&dwmain);
/*建立主线程*/
if (m_port.InitPort(dwmain, 2, 9600 ))
m_port.StartMonitoring();
... ...
}
DWORD WINAPI ThreadProc(void* p)
{
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_COMM_RXCHAR:
/*接收到字符*/
receivestr+=char(msg.wParam);
break;
case WM_COMM_CTS_DETECTED:
/*启动数据库查询子线程*/
CreateThread(NULL,0,AdoThread,0,0,&dwado);
receivestr="";
break;
case WM_QUIT:
return 5;
default:
break;
}
}
return 10;
}
DWORD WINAPI AdoThread(void* p)
{
_RecordsetPtr m_pRecordset;
_variant_t vID,vUserID,vUsername,vOld,vBirthday;
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
vID = m_pRecordset->GetCollect("ID");
vUsername = m_pRecordset->GetCollect("username");
vOld = m_pRecordset->GetCollect("old");
vBirthday = m_pRecordset->GetCollect("birthday");
m_pRecordset->MoveNext();
...
/*在此处理数据*/
}
}
catch(_com_error e)/*捕捉异常*/
{
... ...
}
... ...
m_port.WriteToPort(replystr);/*回送命令字符*/
return 10;
}
void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
{
... ...
bResult = ReadFile(port->m_hComm,&RXBuff,1,&BytesRead,&port->m_ov);
... ...
/*把WM_COMM_RXCHAR消息传递给主线程port->m_pOwner*/
::PostThreadMessage(port->m_pOwner, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);
... ...
}
编程资料 -C#
多
线程
编程资料 -
多
线程
C#
多
线程
编程实例实战作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读次数:10996单个写入
程序
/多个阅读
程序
在.Net 类库中其实已经提供了实现,即System.Threading.ReaderWriterLock 类。本文通过对常见的单个写入/多个阅读
程序
的分析来探索c#的
多
线程
编程。问题的提出所谓单个写入
程序
/多个阅读
C/C++笔试题(很多)
微软亚洲技术中心的面试题!!! 1.进程和
线程
的差别。
线程
是指进程内的
一个
执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:
线程
作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同
一个
进程的多个
线程
之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,
线程
不拥有系统资源,但可以访问隶属于进程的资源. (4)系
java高级进阶面试题
JVM 面试题目 1.请简单描述下 JVM 运行时数据区包括哪些部分? JVM 在执行 Java
程序
的过程中会把它管理的内存分为若干个不同的区域,这些组成部 分有些是
线程
私有的,有些则是
线程
共享的
线程
私有的:
程序
计数器,虚拟机栈,本地方法栈
线程
共享的:方法区,堆 2.JVM 中是怎么判断对象可回收的? 可达性分析算法 这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节 点开始向下搜索,节点所走过的路径称为引用链,当
一个
对象到 GC Roots 没有任何引用链 相连的
好全面的python笔记,那我就笑纳了
注:本笔记基于python2.6而编辑,尽量的偏向3.x的语法Python的特色 1.简单 2.易学 3.免费、开源 4.高层语言: 封装内存管理等 5.可移植性:
程序
如果避免使用依赖于系统的特性,那么无需修改就可以在任何平台上运行 6.解释性: 直接从源代码运行
程序
,不再需要担心如何编译
程序
,使得
程序
更加易于移植。 7.面向对象: 支持面向过程的编程也支持面...
Python学习笔记
Python的特色 1.简单 2.易学 3.免费、开源 4.高层语言: 封装内存管理等 5.可移植性:
程序
如果避免使用依赖于系统的特性,那么无需修改就可以在任何平台上运行 6.解释性: 直接从源代码运行
程序
,不再需要担心如何编译
程序
,使得
程序
更加易于移植。 7.面向对象: 支持面向过程的编程也支持面向对象的编程。 8.可扩
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章