线程!线程!线程!!!
看到有的同学对bcb的线程认识不够深,特开一贴给同学们讲讲。
主要给出两种常用的线程形式。
1、长等待型线程示例,等待命令,执行不定长的工作,但每个工作的时间不会太长。
2、长工作型线程示例,执行一个很长时间的工作,但可以很快响应取消操作。
主程序
//---------------------------------------#include "myThreadBUnit.h"myThreadB *thb=NULL;//---------------------------------------void __fastcall TForm1::OnThreadMessage(TMessage& Message){ //与线程约定了,显示字串并delete它. char *p=(char*)Message.LParam; Memo1->Lines->Add(p); delete p; //BEGIN_MESSAGE_MAP // MESSAGE_HANDLER(WM_USER+100,TMessage,OnThreadMessage); //END_MESSAGE_MAP(TForm)}//---------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ //建立线程. if(thb==NULL) { thb=new myThreadB(false);//创建线程并挂起,挂起的目的是向thb写参数. thb->self=&thb; thb->mainWin=Handle; thb->msgMsg=WM_USER+100; thb->Resume(); //运行线程. }}//---------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender){ //给线程一个命令. if(thb!=NULL) PostThreadMessage(thb->ThreadID,WM_USER+1000,1000,0);}//---------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender){ //结束线程. if(thb!=NULL) { if(!thb->exit()) ShowMessage("线程退出超时!"); }}//---------------------------------------
//---------------------------------------#ifndef myThreadBUnitH#define myThreadBUnitH//---------------------------------------#include <Classes.hpp>//---------------------------------------class myThreadB : public TThread{private: void __fastcall runInit(); void __fastcall ShowMess(char *message);protected: void __fastcall Execute();public: __fastcall myThreadB(bool CreateSuspended); __fastcall ~myThreadB(void); //析构函数. HANDLE mainWin; //主线程窗体. unsigned short int msgMsg; //与主线程通讯用,用于显示线程的消息. myThreadB **self; //可以把主线程中的线程指针置NULL. bool __fastcall exit(); //主线程调用,结束线程.};//---------------------------------------#endif
//---------------------------------------#include <vcl.h>#pragma hdrstop#include "myThreadBUnit.h"#pragma package(smart_init)//---------------------------------------// Important: Methods and properties of objects in VCL can only be// used in a method called using Synchronize, for example://// Synchronize(UpdateCaption);//// where UpdateCaption could look like://// void __fastcall myThreadB::UpdateCaption()// {// Form1->Caption = "Updated in a thread";// }//---------------------------------------__fastcall myThreadB::myThreadB(bool CreateSuspended) : TThread(CreateSuspended){ //这里的代码运行在父线程的上下文中. //无需显示使用delete,就可激活 析构函数. FreeOnTerminate=true; self=NULL; mainWin=NULL; msgMsg=0;}//---------------------------------------__fastcall myThreadB::~myThreadB(void){ char mess[32]; wsprintf(mess,"thread:%d 退出",ThreadID); ShowMess(mess); if(self!=NULL) *self=NULL;}//---------------------------------------void __fastcall myThreadB::runInit(){ //运行在当前线程环境中. char mess[32]; wsprintf(mess,"thread:%d 建立",ThreadID); ShowMess(mess);}//---------------------------------------void __fastcall myThreadB::Execute(){ MSG msg; int i=0; runInit(); //第一种工作形式是长等待,只是偶尔有工作需要做,很快做完又处于等待状态. //比如标准的视频处理,每帧图像5ms处理完了,需要等35ms,下一帧图像才会来. ShowMess("长等待"); while(true)//长等待型线程示例,等待命令,执行不定长的工作,但时间不会太长. { //检查消息队列,消息队列中无消息则阻塞在此,因此我叫它长等待. GetMessage(&msg,NULL,0,-1); if(msg.message==WM_USER+1000) //其它线程发来命令了. { Beep(1000,100);//模拟工作100毫秒. //和主线程通一下讯. char mess[32]; wsprintf(mess,"thread:%d i:%d",ThreadID,i++); ShowMess(mess); } else if(msg.message==0) //其它线程发来退出消息. { if(msg.lParam!=0) SetEvent((void*)msg.lParam); break; } } //第二种工作形式,线程是长工作状态. //长工作又可分为两种形式, //一种是处于某个冗长的循环中, //一种是阻塞于某个事件或信号量中. ShowMess("长工作"); while(true)//长工作型线程示例,执行一个很长时间的工作,但可以很快响应取消操作. { //既便是处于长工作状态中,也要想办法至少每秒检查1次消息队列. //如果线程处于等待某个事件中而没有机会检查消息队列,参考exit()中的注释. //无论消息队列中有无消息,PeekMessage()都不阻塞线程. if(PeekMessage(&msg,NULL,0,-1,PM_REMOVE)) { if(msg.message==0) //主线程发来退出消息. { if(msg.lParam!=0) SetEvent((void*)msg.lParam); break; //退出线程. } } Beep(1000,1000);//模拟长工作秒. }}//---------------------------------------bool __fastcall myThreadB::exit(){ //运行于调用线程的上下文中. HANDLE exitEvent; bool exitOK=true; exitEvent=CreateEvent(NULL,false,false,NULL); PostThreadMessage(ThreadID,0,0,(long)exitEvent); //如果线程阻塞于某个事件xxxEvent中,那么需要用SetEvent(xxxEvent)使线程解除阻塞, //以便线程有机会检查到上面发出的退出消息0. //如果线程没有快速的检查到退出消息,那么调用线程最多等待(被阻塞)2000ms. if(WAIT_TIMEOUT==WaitForSingleObject(exitEvent,2000)) exitOK=false; CloseHandle(exitEvent); return exitOK;}//---------------------------------------void __fastcall myThreadB::ShowMess(char *message){ if(mainWin==NULL) return; char *newStr=new char[128]; lstrcpyn(newStr,message,128); PostMessage(mainWin,msgMsg,0,(long)newStr); //不要在此delete newStr. //和主线程约定,newStr在主线程中delete.}//---------------------------------------
192.168.11.116 6C-F0-49-62-37-61
192.168.11.117 /
192.168.11.118 /
192.168.11.119 /
192.168.11.120 /
192.168.11.121 00-16-E6-32-D6-B9
192.168.11.122 /
192.168.11.123 /
192.168.11.124 00-24-1D-EE-30-5E
192.168.11.125 /
192.168.11.126 52-54-AB-54-D3-B9
192.168.11.127 /
192.168.11.128 /
192.168.11.129 /
192.168.11.130 00-19-66-10-70-D9
192.168.11.131 00-05-1C-17-81-87
192.168.11.132 00-50-8D-6A-B7-14
192.168.11.133 /
192.168.11.134 00-06-5B-1F-B1-26
192.168.11.135 /
192.168.11.136 /
192.168.11.137 /
192.168.11.138 /
192.168.11.139 /
192.168.11.140 /
192.168.11.141 /
192.168.11.142 00-14-85-DB-C4-81
192.168.11.143 /
192.168.11.144 00-25-11-A9-DC-A3
192.168.11.145 /
192.168.11.146 /
192.168.11.147 /
192.168.11.148 00-20-ED-A7-0B-42
192.168.11.149 /
192.168.11.150 00-10-DC-74-E2-41
192.168.11.151 00-0A-EB-D1-54-BD
192.168.11.152 00-1F-D0-1B-B6-D0
192.168.11.153 /
192.168.11.154 /
192.168.11.155 /
192.168.11.156 /
192.168.11.157 /
192.168.11.158 /
192.168.11.159 /
192.168.11.160 /
192.168.11.161 00-16-76-59-FC-0A
192.168.11.162 /
192.168.11.163 /
192.168.11.164 /
192.168.11.165 /
192.168.11.166 /
192.168.11.167 /
192.168.11.168 /
192.168.11.169 /
192.168.11.170 00-E0-4C-02-7B-4F
192.168.11.171 00-25-11-48-FB-7E
192.168.11.172 /
192.168.11.173 /
192.168.11.174 /
192.168.11.175 /
192.168.11.176 /
192.168.11.177 /
192.168.11.178 /
192.168.11.179 /
192.168.11.180 /
192.168.11.181 /
192.168.11.182 /
192.168.11.183 /
192.168.11.184 /
192.168.11.185 /
192.168.11.186 /
192.168.11.187 /
192.168.11.188 00-25-11-49-2D-59
192.168.11.189 00-05-5D-61-BD-91
192.168.11.190 /
192.168.11.191 /
192.168.11.192 /
192.168.11.193 /
192.168.11.194 00-25-11-49-2D-54
192.168.11.195 /
192.168.11.196 00-05-5D-0E-9E-2A
192.168.11.197 /
192.168.11.198 /
192.168.11.199 00-14-85-DB-C6-C1
192.168.11.200 00-40-05-41-F3-B1
192.168.11.201 /
192.168.11.202 68-B5-99-AB-02-4B
192.168.11.203 /
192.168.11.204 /
192.168.11.205 /
192.168.11.206 /
192.168.11.207 /
192.168.11.208 /
192.168.11.209 /
192.168.11.210 /
192.168.11.211 00-25-11-49-2E-56
192.168.11.212 /
192.168.11.213 /
192.168.11.214 /
192.168.11.215 00-10-DC-73-8B-5D
192.168.11.216 /
192.168.11.217 /
192.168.11.218 /
192.168.11.219 /
192.168.11.220 /
192.168.11.221 /
192.168.11.222 6C-F0-49-A1-9C-DC
192.168.11.223 /
192.168.11.224 /
192.168.11.225 /
192.168.11.226 /
192.168.11.227 /
192.168.11.228 /
192.168.11.229 /
192.168.11.230 /
192.168.11.231 /
192.168.11.232 /
192.168.11.233 /
192.168.11.234 /
192.168.11.235 /
192.168.11.236 /
192.168.11.237 /
192.168.11.238 /
192.168.11.239 /
192.168.11.240 /
192.168.11.241 /
192.168.11.242 /
192.168.11.243 00-10-DC-75-74-A7
192.168.11.244 /
192.168.11.245 /
192.168.11.246 /
192.168.11.247 /
192.168.11.248 /
192.168.11.249 /
192.168.11.250 00-1C-F0-82-23-54
192.168.11.251 /
192.168.11.252 /
192.168.11.253 /
192.168.11.254 00-09-E8-31
只要五秒,呵呵,真快!60个线程!
[解决办法]
楼主的分享精神不错,推荐一下.
[解决办法]
做笔记中...
[解决办法]
楼主的分享精神不错,推荐一下.
------解决方案--------------------
[解决办法]
观摩技术性讨论
[解决办法]
严重接分。
[解决办法]
严重接分
[解决办法]
123123123123123
[解决办法]
12312312112213213
[解决办法]
c啊c~~~~~
[解决办法]
线程线程线程线程线程
[解决办法]
来顶的, 也攒点分啊。
[解决办法]
来顶的, 也攒点分啊。
[解决办法]
路过~学习~~~~~~~~~~
[解决办法]
顶,求分
[解决办法]
mark
[解决办法]
楼主很性感
[解决办法]
来看LZ头像的,顺便看一下程序
[解决办法]
多谢、、、
[解决办法]
接分了
[解决办法]
[解决办法]
看一下头像,顺便看看程序。。。
[解决办法]
看看。。。
[解决办法]
谢谢楼主分享!!!!!!!!!!
[解决办法]
看楼主头像的顺便看看程序
[解决办法]
分啊;csdn频道挺好就是不该不是免费的
[解决办法]
谢谢啊,学习了,太好了,一直也不太明白的。多谢指点。
[解决办法]
学习啦
[解决办法]
学习为主 拜谢
[解决办法]
仔细看看...
[解决办法]
很好 谢谢楼主~~~~~……
[解决办法]
学习,感谢!
[解决办法]
学习接分!写得不错!
[解决办法]
看的不是很懂 ~
[解决办法]
学习下
[解决办法]
来挂名的,学习……
[解决办法]
线程 还没用过的呢
[解决办法]
------解决方案--------------------
看看...
[解决办法]
图片很性感,线程不太懂
[解决办法]
mark
[解决办法]
这个算茶馆帖还是技术帖呢
[解决办法]
我开始怀疑我的智商了,看不懂。。
[解决办法]
技術貼吧!
[解决办法]
牛!..........
[解决办法]
接分和做标志两线程一起执行。
[解决办法]
问LZ一个问题
beep函数--这个耗时的函数在执行过程中,突然主线程发消息要退出线程,PEEKMESSAGE这时能接收消息并处理吗?
[解决办法]
mark,学习先>_<
[解决办法]
learning......
[解决办法]
楼主的分不错,哈哈,支持下
[解决办法]
看了你的头像就没别的心思看代码了。。。
[解决办法]
有点头大!
[解决办法]
学习中 , 来打个酱油!
[解决办法]
正在线程学习中,网络上看到的都太初级!如果楼主能够来点深入的C多线程编程讲座就好了!
[解决办法]
很好很好
[解决办法]
楼主你这种精神要继续发扬哦、、、、
[解决办法]
有没有delphi版的?
虽然也懂c,但是看着还是比较吃力
[解决办法]
顶顶顶顶顶顶顶顶顶顶顶顶顶
[解决办法]
学习学习
[解决办法]
if(msg.lParam!=0)
SetEvent((void*)msg.lParam);
break; //退出线程.
}
[解决办法]
好厉害^^谢谢楼主
[解决办法]
学习了,呵呵
[解决办法]
[解决办法]
祝楼主情人节快乐!