首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

线程!线程!线程!该怎么处理

2012-02-07 
线程!线程!线程!!!看到有的同学对bcb的线程认识不够深,特开一贴给同学们讲讲。主要给出两种常用的线程形式。

线程!线程!线程!!!
看到有的同学对bcb的线程认识不够深,特开一贴给同学们讲讲。

主要给出两种常用的线程形式。

1、长等待型线程示例,等待命令,执行不定长的工作,但每个工作的时间不会太长。
2、长工作型线程示例,执行一个很长时间的工作,但可以很快响应取消操作。

主程序

C/C++ code
//---------------------------------------#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("线程退出超时!");   }}//---------------------------------------

线程,myThreadBUnit.h
C/C++ code
//---------------------------------------#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

线程,myThreadBUnit.cpp
C/C++ code
//---------------------------------------#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.}//--------------------------------------- 







[解决办法]
接分来了。
[解决办法]

[解决办法]
这次,据IP取局域网内所有电脑的MAC地址,原来顺序取要五分钟,
这次我改多线程就5秒,终于领悟到多线程的威力。

[解决办法]
192.168.11.1 00-1D-7D-39-61-B1
192.168.11.2 00-1F-D0-D2-9F-61
192.168.11.3 00-14-85-80-94-BD
192.168.11.4 00-05-1C-16-79-DF
192.168.11.5 /
192.168.11.6 00-21-85-07-F2-0A
192.168.11.7 00-25-11-F1-7A-34
192.168.11.8 00-E0-4C-00-EC-C6
192.168.11.9 00-10-DC-72-C2-A2
192.168.11.10 00-05-5D-61-BD-81
192.168.11.11 /
192.168.11.12 00-10-DC-72-CF-C1
192.168.11.13 00-1B-FC-5A-05-B1
192.168.11.14 00-0A-E6-E5-35-BC
192.168.11.15 00-10-DC-75-74-A9
192.168.11.16 00-10-DC-47-89-B3
192.168.11.17 /
192.168.11.18 00-18-F3-BF-E4-67
192.168.11.19 00-19-D1-A0-B6-49
192.168.11.20 00-10-DC-73-F7-83
192.168.11.21 00-E0-4C-CC-97-61
192.168.11.22 /
192.168.11.23 00-13-20-B6-C6-F4
192.168.11.24 /
192.168.11.25 00-0F-3D-2A-75-0E
192.168.11.26 00-0C-76-FC-71-48
192.168.11.27 00-D0-B7-72-2C-D6
192.168.11.28 /
192.168.11.29 00-B0-D0-FC-6A-00
192.168.11.30 00-06-5B-F0-16-4A
192.168.11.31 00-06-5B-F0-19-01
192.168.11.32 90-FB-A6-0B-EF-BA
192.168.11.33 90-FB-A6-1E-C9-01
192.168.11.34 00-1C-F0-82-23-53
192.168.11.35 00-24-1D-B9-40-5C
192.168.11.36 /
192.168.11.37 /
192.168.11.38 /
192.168.11.39 /
192.168.11.40 00-0B-DB-B2-D3-BA
192.168.11.41 /
192.168.11.42 00-13-20-B6-C6-E9
192.168.11.43 /
192.168.11.44 /
192.168.11.45 00-0C-76-FC-70-F1
192.168.11.46 /
192.168.11.47 /
192.168.11.48 /
192.168.11.49 /
192.168.11.50 /
192.168.11.51 /
192.168.11.52 00-06-5B-1F-B2-EA
192.168.11.53 /
192.168.11.54 /
192.168.11.55 /
192.168.11.56 /
192.168.11.57 /
192.168.11.58 00-13-20-78-07-97
192.168.11.59 /
192.168.11.60 00-25-11-48-FB-2B
192.168.11.61 90-FB-A6-0B-CA-EC
192.168.11.62 90-FB-A6-0B-F0-E7
192.168.11.63 00-25-11-48-51-3F
192.168.11.64 00-05-5D-E6-98-87
192.168.11.65 00-24-1D-32-FD-BB
192.168.11.66 /
192.168.11.67 00-25-11-48-54-69
192.168.11.68 00-16-E6-34-3B-A2
192.168.11.69 /
192.168.11.70 /
192.168.11.71 /
192.168.11.72 /
192.168.11.73 00-10-DC-75-75-49
192.168.11.74 /
192.168.11.75 /
192.168.11.76 /
192.168.11.77 00-11-09-11-FC-92
192.168.11.78 00-1D-7D-42-D6-D9
192.168.11.79 00-E0-06-F6-87-41
192.168.11.80 /
192.168.11.81 00-E0-4C-DC-09-BB
192.168.11.82 90-FB-A6-0B-CD-12
192.168.11.83 00-0A-EB-9B-7F-78
192.168.11.84 00-25-11-49-2D-3D
192.168.11.85 00-25-11-49-30-86
192.168.11.86 00-25-11-48-51-4A
192.168.11.87 00-10-DC-72-CA-19
192.168.11.88 00-E0-4C-DC-06-78
192.168.11.89 90-FB-A6-09-DF-28
192.168.11.90 00-25-11-48-53-A1
192.168.11.91 /
192.168.11.92 /
192.168.11.93 /
192.168.11.94 /
192.168.11.95 00-24-21-77-9A-7F
192.168.11.96 52-54-AB-40-F4-24
192.168.11.97 00-E0-4C-48-97-DB
192.168.11.98 /
192.168.11.99 90-FB-A6-09-E1-84
192.168.11.100 /
192.168.11.101 00-1F-D0-11-00-64
192.168.11.102 00-11-95-FD-29-09
192.168.11.103 /
192.168.11.104 /
192.168.11.105 /
192.168.11.106 /
192.168.11.107 /
192.168.11.108 /
192.168.11.109 /
192.168.11.110 /
192.168.11.111 90-FB-A6-0B-F1-03
192.168.11.112 /
192.168.11.113 /
192.168.11.114 00-50-C2-02-0E-05
192.168.11.115 /


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多线程编程讲座就好了!
[解决办法]

探讨
看到有的同学对bcb的线程认识不够深,特开一贴给同学们讲讲。

主要给出两种常用的线程形式。

1、长等待型线程示例,等待命令,执行不定长的工作,但每个工作的时间不会太长。
2、长工作型线程示例,执行一个很长时间的工作,但可以很快响应取消操作。

主程序

C/C++ code

//----------------------------------------------……

[解决办法]
那些神马拿别人照片当头像的人最讨厌了~
[解决办法]
探讨
这个算茶馆帖还是技术帖呢

[解决办法]
蛮不错的东西,对VC有些欠缺,但还是值得学习!
[解决办法]
学习ing 中
记笔记!!!
[解决办法]
来学习的。。
[解决办法]
回帖能给分?试一下
[解决办法]


学习

收藏
[解决办法]
学习!
[解决办法]
看的眼都花了,呵呵
[解决办法]
研究研究
[解决办法]
来看楼主的头像的
[解决办法]
rthusrtyhsrtrtsjhsrtjhsrthrtjhrthjrt
[解决办法]
程序写得太漂亮了。
[解决办法]


很好很好
[解决办法]
楼主你这种精神要继续发扬哦、、、、
[解决办法]
有没有delphi版的?

虽然也懂c,但是看着还是比较吃力
[解决办法]
顶顶顶顶顶顶顶顶顶顶顶顶顶
[解决办法]
学习学习
[解决办法]
if(msg.lParam!=0)
SetEvent((void*)msg.lParam);
break; //退出线程.
}

[解决办法]
好厉害^^谢谢楼主
[解决办法]
学习了,呵呵
[解决办法]

[解决办法]
祝楼主情人节快乐!

热点排行