社区
进程/线程/DLL
帖子详情
設計討論!!!!請教高手這樣的系統要如何架構?????
Magusflp008
2004-07-21 08:43:04
小弟現有一個數據採集的項目;
大概有35個採集終端,用tcp/ip通訊,要求實時採集,即是當終端一有數據輸入,我的程序就要有所動作.
這樣的系統該如何處理線程上的問題呢?
望各位指教!!!!!!
...全文
145
11
打赏
收藏
設計討論!!!!請教高手這樣的系統要如何架構?????
小弟現有一個數據採集的項目; 大概有35個採集終端,用tcp/ip通訊,要求實時採集,即是當終端一有數據輸入,我的程序就要有所動作. 這樣的系統該如何處理線程上的問題呢? 望各位指教!!!!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Magusflp008
2004-07-24
打赏
举报
回复
UP
mfmmfc
2004-07-22
打赏
举报
回复
if you can use MFC
you can use 35 CScoket objects in your project,
have a try !
Wenxy1
2004-07-21
打赏
举报
回复
呵呵,路过。
nineclock
2004-07-21
打赏
举报
回复
发错了
一个进程可以拥有500到1000多线程,我印象中好像是,有错不要怪我哦
nineclock
2004-07-21
打赏
举报
回复
一个线程拥有500到1000多没问题
Magusflp008
2004-07-21
打赏
举报
回复
操作系統最多能承受多少線程??
shootingstars
2004-07-21
打赏
举报
回复
可以使用阻塞模式,使线程平时阻塞于recv,一旦接收到数据,马上处理。
不要使用短连接(即每次发送数据时重新建立连接),那样建立连接和创建新线程都需要额外的开销。
shootingstars
2004-07-21
打赏
举报
回复
终端上线(初始)时就与服务器建立tcp连接,并且一直保持这个tcp的连接。
服务器对应每个连接一个线程。同时开35个线程并不多。
Magusflp008
2004-07-21
打赏
举报
回复
怎麼只有一位仁兄阿????
nineclock
2004-07-21
打赏
举报
回复
多线程处理,接到一个数据就开一个线程
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完后再执行。在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样可使处理器任务平衡,并提高系统的运行效率。
Windows是一种多任务的操作系统,在Windows的一个进程内包含一个或多个线程。32位Windows环境下的Win32 API提供了多线程应用程序开发所需要的接口函数,而利用VC中提供的标准C库也可以开发多线程应用程序,相应的MFC类库封装了多线程编程的类,用户在开发时可根据应用程序的需要和特点选择相应的工具。为了使大家能全面地了解Windows多线程编程技术,本文将重点介绍Win32 API和MFC两种方式下如何编制多线程程序。
多线程编程在Win32方式下和MFC类库支持下的原理是一致的,进程的主线程在任何需要的时候都可以创建新的线程。当线程执行完后,自动终止线程; 当进程结束后,所有的线程都终止。所有活动的线程共享进程的资源,因此,在编程时需要考虑在多个线程访问同一资源时产生冲突的问题。当一个线程正在访问某进程对象,而另一个线程要改变该对象,就可能会产生错误的结果,编程时要解决这个冲突。
Win32 API下的多线程编程
Win32 API是Windows操作系统内核与应用程序之间的界面,它将内核提供的功能进行函数包装,应用程序通过调用相关函数而获得相应的系统功能。为了向应用程序提供多线程功能,Win32 API函数集中提供了一些处理多线程程序的函数集。直接用Win32 API进行程序设计具有很多优点: 基于Win32的应用程序执行代码小,运行效率高,但是它要求程序员编写的代码较多,且需要管理所有系统提供给程序的资源。用Win32 API直接编写程序要求程序员对Windows系统内核有一定的了解,会占用程序员很多时间对系统资源进行管理,因而程序员的工作效率降低。
1. 用Win32函数创建和终止线程
Win32函数库中提供了操作多线程的函数,包括创建线程、终止线程、建立互斥区等。在应用程序的主线程或者其他活动线程中创建新的线程的函数如下:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);
如果创建成功则返回线程的句柄,否则返回NULL。创建了新的线程后,该线程就开始启动执行了。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,那么线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程,在这个过程中可以调用下面这个函数来设置线程的优先权:
BOOL SetThreadPriority(HANDLE hThread,int nPriority);
当调用线程的函数返回后,线程自动终止。如果需要在线程的执行过程中终止则可调用函数:
VOID ExitThread(DWORD dwExitCode);
如果在线程的外面终止线程,则可调用下面的函数:
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
但应注意: 该函数可能会引起系统不稳定,而且线程所占用的资源也不释放。因此,一般情况下,建议不要使用该函数。
如果要终止的线程是进程内的最后一个线程,则线程被终止后相应的进程也应终止。
2. 线程的同步
在线程体内,如果该线程完全独立,与其他线程没有数据存取等资源操作上的冲突,则可按照通常单线程的方法进行编程。但是,在多线程处理时情况常常不是这样,线程之间经常要同时访问一些资源。由于对共享资源进行访问引起冲突是不可避免的,为了解决这种线程同步问题,Win32 API提供了多种同步控制对象来帮助程序员解决共享资源访问冲突。在介绍这些同步对象之前先介绍一下等待函数,因为所有控制对象的访问控制都要用到这个函数。
Win32 API提供了一组能使线程阻塞其自身执行的等待函数。这些函数在其参数中的一个或多个同步对象产生了信号,或者超过规定的等待时间才会返回。在等待函数未返回时,线程处于等待状态,此时线程只消耗很少的CPU时间。使用等待函数既可以保证线程的同步,又可以提高程序的运行效率。最常用的等待函数是:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
而函数WaitForMultipleObject可以用来同时监测多个同步对象,该函数的声明为:
DWORD WaitForMultipleObject(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);
(1)互斥体对象
Mutex对象的状态在它不被任何线程拥有时才有信号,而当它被拥有时则无信号。Mutex对象很适合用来协调多个线程对共享资源的互斥访问。可按下列步骤使用该对象:
首先,建立互斥体对象,得到句柄:
HANDLE CreateMutex();
然后,在线程可能产生冲突的区域前(即访问共享资源之前)调用WaitForSingleObject,将句柄传给函数,请求占用互斥对象:
dwWaitResult = WaitForSingleObject(hMutex,5000L);
共享资源访问结束,释放对互斥体对象的占用:
ReleaseMutex(hMutex);
互斥体对象在同一时刻只能被一个线程占用,当互斥体对象被一个线程占用时,若有另一线程想占用它,则必须等到前一线程释放后才能成功。
(2)信号对象
信号对象允许同时对多个线程共享资源进行访问,在创建对象时指定最大可同时访问的线程数。当一个线程申请访问成功后,信号对象中的计数器减一,调用ReleaseSemaphore函数后,信号对象中的计数器加一。其中,计数器值大于或等于0,但小于或等于创建时指定的最大值。如果一个应用在创建一个信号对象时,将其计数器的初始值设为0,就阻塞了其他线程,保护了资源。等初始化完成后,调用ReleaseSemaphore函数将其计数器增加至最大值,则可进行正常的存取访问。可按下列步骤使用该对象:
首先,创建信号对象:
HANDLE CreateSemaphore();
或者打开一个信号对象:
HANDLE OpenSemaphore();
然后,在线程访问共享资源之前调用WaitForSingleObject。
共享资源访问完成后,应释放对信号对象的占用:
ReleaseSemaphore();
Magusflp008
2004-07-21
打赏
举报
回复
非常感謝大家
大家還有什麼建議
asp.net知识库
Asp.net 利用OleDb的GetOLEDBSchemaTable方法得到数据库架构信息 用于 Visual Studio .Net 的 IBM DB2 开发外接程序 第2章 并发操作的一致性问题 (2) Using sqlite with .NET Visual Studio 2005 中的新 DataSet ...
18年互联网老兵:技术人如何快速成长?!
见字如面,我是军哥。先问你几个问题。...作为 IT 行业奋战了 18 年的老兵我,今天的文章将从「快速正反馈、突破边界、闭环思维、系统方法」四点逐一展开。—1—快速正反馈一般来说,我们走上工...
微信小程序系统教程python版[3/3阶段]_微信小程序电商系统
微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”...
谈谈我对协议栈设计和架构的理解
因为工作的关系,有幸接触到一种不那么复杂的2G通信技术的协议栈(终端)和基带两方面的内容,经过一段较长时间的摸索和思考,再加上和终端厂商一线开发人员的的讨论深化,到现在总算对协议栈设计和架构方面有了一些...
我们一起聊聊性能测试是怎么一回事?
这个时候开发再回头进行系统调优,如果事先选的架构能支撑就好,如果不能达不到预期值,后面讨论或者请教
高手
发现原先的架构缺陷,再调整架构代价就非常大。基本导致前期的功能测试成果作废。其实各个阶段都有事情做...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章