Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > Win32程序设计初步之线程
全文

Win32程序设计初步之线程

2004-11-05 00:04 作者: QQ新人类编译 出处: 天极网 责任编辑:方舟
  第二个简单例子

以下的代码是另一个这样例子,在后台中运行一个独立于主线程的线程。这个后台线程将会发出嘟嘟声,而主线程将会等待它完成。这段代码展示了如果传送一个整型的参数到一个线程中,以及如何等待一个线程完成处理。

// thread1.cpp

#include
#include
#include

// The function to run in a thread
void HonkThread(DWORD iter)
{
 DWORD i;

 for (i=0; i < iter; i++)
 {
  Beep(200, 50);
  Sleep(1000);
 }
}

void main(void)
{
 HANDLE honkHandle;
 DWORD threadID;
 DWORD iterations;
 CHAR iterStr[100];

 cout << "Enter the number of beeps to produce: ";
 cin.getline(iterStr, 100);

 // convert string into integer
 iterations=atoi(iterStr);

 // create a thread which
 // executes the "HonkThread" function
 honkHandle=CreateThread(0, 0, (LPTHREAD_START_ROUTINE) HonkThread, (VOID *) iterations, 0, &threadID);

 // wait until the thread has finished
 int count=0;
 while ( WaitForSingleObject(honkHandle, 0)== WAIT_TIMEOUT)
 {
  cout<< "waiting for the thread to finish "
  << count++
  << endl;
 }
}

  在你运行以上代码时,你将要输入一个整型的值,例如5。主程序将会启动线程,并且通过参数将值5传送给它。该线程将会在后台运行,发出5次的嘟嘟声,然后退出。同时,主程序会等待后台线程退出,这个操作通过使用一个循环中的WaitForSingleObject函数完成。每次循环它都会增加一个整型变量的值,并且将它输出到标准输出中。

  WaitForSingleObject函数等待线程处理完毕。如果传入一个0值,则表示超时,这将令WaitForSingleObject马上返回,并且指出线程是否已经完成。如果线程没有完成,WaitForSingleObject返回WAIT_TIMEOUT。在这里,我们只是使用WaitForSingleObject来检测后台线程是否已经完成。

  传送一个结构体给一个线程函数也是可能的,可以通过传送一个指向结构体的指针参数来完成,以下就是一个这样的例子。结构体应该是稳定的,也就是说,它应该是一个全局的变量、一个静态的局部变量或者由堆栈分配得来。结构体不应该使用一个函数中的局部变量,因为它的值可能会在线程运行期间消失。

#include
#include
#include

typedef struct
{
 DWORD frequency;
 DWORD duration;
 DWORD iterations;
} honkParams;

void HonkThread(honkParams *params)
{
 DWORD i;

 for (i=0; i < params->iterations; i++)
 {
  Beep(params->frequency, params->duration);
  Sleep(1000);
 }
}

void main(void)
{
 HANDLE honkHandle;
 DWORD threadID;
 honkParams params;
 CHAR freqStr[100];
 CHAR durStr[100];
 CHAR iterStr[100];

 cout << "Enter the beep frequency to produce: ";
 cin.getline(freqStr, 100);
 params.frequency=atoi(freqStr);

 cout << "Enter the beep duration to produce: ";
 cin.getline(durStr, 100);
 params.duration=atoi(durStr);

 cout << "Enter the number of beeps to produce: ";
 cin.getline(iterStr, 100);
 params.iterations=atoi(iterStr);

 // create a thread and pass it the address of
 file://the "params" structure
 honkHandle=CreateThread(0, 0, (LPTHREAD_START_ROUTINE) HonkThread, ms, 0, &threadID);

 WaitForSingleObject(honkHandle, INFINITE);
}

  在上面的代码中,通过用户输入的三个值被放在一个结构体中,然后传送给线程。主函数通过调用WaitForSingleObject,以防止在线程完成前终止。没有这个调用的话,主函数将会很快地返回,并且终止主进程和该线程。

共4页。 9 7 1 2 3 4 8 :
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml