高手坐镇(38)

数字职场

VS2005中创建一个线程

题目难度:★★★★

读者来信:本学期,我们要学习VS2005,由于个人兴趣我提前学到后面了,现在卡在一个地方,希望《电脑报》的高手指点一下。我碰到的难题是,如何创建一个线程(此线程的功能是对变量iCount进行累加,就是每秒加1,并在窗体上显示iCount的值,当iCount为5时停止累加)?

高级工程师 曾虹云:你在自学?这个有难度,我来帮帮你吧!

1.使用函数CreateThread创建线程,线程创建后会执行CreateThread函数指定的自定义函数。

2.自定义函数体中为了实现iCount的累加,使用while(1)循环。

3.为了实现当iCount为5时不再累加,使用事件对象来控制线程的运行(事件对象有信号时,执行线程;事件对象无信号时挂起线程),执行累加后判断当iCount的值大于等于5的时候设置事件对象为无信号,把线程挂起,并把值显示在窗体上。

4.为了让线程执行速度慢一点,使用sleep(1000)让线程执行一次就挂起1秒,便于检测变量iCount的值。程序实现如下:

//在WinMain入口函数中的UpdateWindow更新窗体之后使用CreateThread创建一个线程和一个事件对象,并把事件对象设置为有信号

test01Thread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)test01, NULL, 0, NULL);//此线程执行函数为test01

h=CreateEvent(NULL, true, false, gSetupSendEventName);

SetEvent(h);//SetEvent设置为有信号状态,ResetEvent设置为无信号状态

CloseHandle(test01Thread);

CloseHandle(h);

//关闭线程内核对象的句柄。这样当线程运行结束时,系统就会自动撤销线程内核对象。

//如果不关闭该句柄,即使线程运行结束,但线程内核对象的使用计数不停止,该对象不会被撤销,这样可能导致进程崩溃。

while(1)

{

if (WAIT_OBJECT_0 == WaitForSingleObject(h, INFINITE))//判断事件对象h是否为有信号状态

{

iCount=iCount+1;//累加iCount

if (iCount>=5)//如果iCount大于等于5则设置事件对象h为无信号状态,挂起线程

{

ResetEvent(h);

}

//输出到屏幕

HDC hDC;

hDC = GetDC(hWnd);

DisplaySignal(hDC);

ReleaseDC(hWnd, hDC);

}

Sleep(1000);

}

return 0;

程序有问题却不提示错误

题目难度:★★☆

读者来信:最近我碰到一个怪事,用C++设计了一个简单程序,调试显示没有任何错误,但运行后屏幕上什么都没有,这就意味着程序失效了,这是怎么回事?程序代码如下所示:

#include

int main()

{

int sum = 0;

int i = 100;

while(i>0);

{

sum += i;

i--;

}

cout<<"求从1到100的和:"<

return 0;

}

编辑 陈邓新:O(∩_∩)O哈哈!这个问题,小编亲自回答吧。想当年,初学C语言的时候,经常碰到各种莫名其妙的小问题,其中一个就是这位读者提到的问题,其原因就是while循环后不能加分号。编程不仔细、不仔细……

C图形程序在VC6中编译不了

题目难度:★☆

读者来信:我是菜鸟一只,问一个菜菜的问题,为什么有的C图形程序在VC6里编译不了?而在Win-TC中却能编译?跪求大虾解释一下。

安全高手 蒲浪:VC6是不是提示缺少函数?如果是这样,那原因就是你用的是TC专有的图形库graphics.h,而VC没有这个东东,建议直接用TC编译。