线程状态切换 退出-暂停-继续

对于SuspendThread函数的没有真正理解清楚.直到最近使用多线程执行任务的时候,发现有时候使用它比额外使用内核对象来更加方便.

DWORD WINAPI ThreadProc( PVOID pvParament )

{

int iCnt = 0;

while ( 1 )

{

cout<<iCnt<<endl;

if ( iCnt > 10000 )

{

break;

}

++iCnt;

}

return 0;

}

void main()

{

bool bExit = FALSE;

HANDLE  hThread = CreateThread( NULL,0,ThreadProc,NULL,0,NULL );

Sleep( 2000 );

SuspendThread( hThread );

Sleep( 2000 );

ResumeThread( hThread );

WaitForSingleObject( hThread,INFINITE );

CloseHandle( hThread );

}


这里简单使用这两个函数来完成线程的运行-中断-继续的状态切换.

核心编程中关于如何完全终止线程问题做出了一些引导:让我们尽量实现线程自己退出,而不是使用Windows那些逼不得已的函数.

代码大概的意思是:

DWORD WINAPI ThreadProc( PVOID pvParament )

{

while( WaitForSingleObject( hEvent,INFINITE ) == WAIT_OBJECT_0 )

{

//循环做一些操作.循环里面保存当前状态.

}

return 0;

}


这样我们可以使用hEvent来控制线程的暂停,继续,和退出.这样总体来讲

这种写法主要的问题有:

1. 整个线程执行体都在while里面,但初始化代码不能放在while,现在的解决方案可能把初始化代码加到while的前面,这样唯一的问题在于无法掌控初始化代码的状态.

2. 线程在控制的时候并不能达到”暂停”的目地,因为需要我们去手动保存当前的状态,等到hEvent变成可触发状态时,再继续(整个过程完全由我们自己来控制),实际上我们可以使用SuspendThread.

要实现外部按钮控制线程暂停和执行,你可以使用 `ManualResetEvent` 类来进行线程同步和控制。 首先,在你的线程类中创建一个 `ManualResetEvent` 对象,并在构造函数中初始化为有信号状态(即允许线程执行)。这个对象将用于控制线程暂停和恢复。 然后,在你的线程函数中,使用 `WaitOne` 方法在需要暂停的地方等待信号。当收到信号时,线程继续执行。 最后,你可以在按钮的点击事件处理程序中,根据需要设置 `ManualResetEvent` 对象的状态,以控制线程暂停和执行。 以下是一个简单的示例: ```csharp using System; using System.Threading; class Program { private static ManualResetEvent pauseEvent = new ManualResetEvent(true); // 初始状态为有信号(允许执行) static void Main() { Thread thread = new Thread(WorkerThread); thread.Start(); // 模拟通过外部按钮控制线程暂停和执行 while (true) { Console.WriteLine("按下回车键来切换线程状态..."); Console.ReadLine(); if (pauseEvent.WaitOne(0)) // 如果当前是暂停状态,则恢复线程执行 { pauseEvent.Set(); Console.WriteLine("线程已恢复执行"); } else // 如果当前是执行状态,则暂停线程 { pauseEvent.Reset(); Console.WriteLine("线程暂停"); } } } static void WorkerThread() { while (true) { // 在需要暂停的地方等待信号 pauseEvent.WaitOne(); // 执行线程的工作任务 Console.WriteLine("线程正在执行工作..."); Thread.Sleep(1000); // 模拟耗时操作 } } } ``` 在上面的示例中,我们创建了一个名为 `pauseEvent` 的 `ManualResetEvent` 对象来控制线程暂停和执行。通过调用 `pauseEvent.WaitOne()` 方法,线程会在需要暂停的地方等待信号。通过调用 `pauseEvent.Set()` 方法,线程会恢复执行。通过调用 `pauseEvent.Reset()` 方法,线程暂停执行。 在主函数中,我们模拟了一个按钮的点击事件处理程序。当按下回车键时,根据当前线程状态,我们设置相应的信号状态来控制线程暂停和执行。 需要注意的是,这里只是简单示例了如何控制线程暂停和执行,并没有涉及到线程安全性等其他方面的考虑。在实际应用中,你可能需要更加细致地处理线程同步和退出等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值