如何暂停主线程,并让其恢复

feng8180 2008-05-27 03:04:58
我用SetTimer做了一个定时器,听别人说这样已经新建了一个线程来,然后想要在一定时候用这个定时器挂起主程序的线程,并且timer的线程继续运行,然后再到一定的条件下恢复这个主线程,用SuspendThread和ReseumThread可以实现吧?还有用SuspendThread需要线程的句柄,请问主程序线程的句柄是什么?怎么获得啊?多谢各位解答!!
...全文
640 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 feng8180 的回复:]
引用 22 楼 happyparrot 的回复:
你的线程代码是啥样?
全局函数中,你肯定不能去调用已经运行的模块中的对象了。

其实我是想这样。我定义了两个函数SETTIMER定时器和B;这两个函数都在同一个对话框类里面,其中B函数正常运行的话要很长很长时间,请问怎么通过SETTIMER定时器去终止B函数的运行。在B函数中用RETURN可以把B函数终止掉,我的意思就是如何在SETTIMER定时器中执行B函数功能。谢谢!
[/Quote]
主線程運行b的時候是不會處理WM_TIMERR消息的
feng8180 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 happyparrot 的回复:]
你的线程代码是啥样?
全局函数中,你肯定不能去调用已经运行的模块中的对象了。
[/Quote]
其实我是想这样。我定义了两个函数SETTIMER定时器和B;这两个函数都在同一个对话框类里面,其中B函数正常运行的话要很长很长时间,请问怎么通过SETTIMER定时器去终止B函数的运行。在B函数中用RETURN可以把B函数终止掉,我的意思就是如何在SETTIMER定时器中执行B函数功能。谢谢!
lwykj 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 feng8180 的回复:]
再补一句:
1、我还试过这样的方法:把函数A里的东西都放到创建的线程里,运行出了很多错。是不是全局函数(线程必须是全局函数)不能用其他类里的东西啊?
2、静态函数是不是不能包含其他类里的东西?
谢谢啦
[/Quote]

线程必须用全局 或 静态函数

用其它类的东西,可以把其它类的对象 指针当成 线程启动参数 传给线程!
快乐鹦鹉 2008-05-28
  • 打赏
  • 举报
回复
你的线程代码是啥样?
全局函数中,你肯定不能去调用已经运行的模块中的对象了。
feng8180 2008-05-28
  • 打赏
  • 举报
回复
再补一句:
1、我还试过这样的方法:把函数A里的东西都放到创建的线程里,运行出了很多错。是不是全局函数(线程必须是全局函数)不能用其他类里的东西啊?
2、静态函数是不是不能包含其他类里的东西?
谢谢啦
feng8180 2008-05-28
  • 打赏
  • 举报
回复
现在又遇到一个问题。我这样做的:
原来的方案:用一个按钮,点击响应函数A,
现在改进的方案:点击按钮,响应函数B,B创建一个线程,线程里激发函数C,C中包含原函数A的所有内容。
但是一运行就出错,因为C不是静态的函数?怎么办。。。。
feng8180 2008-05-27
  • 打赏
  • 举报
回复
十分感谢。我正在看。成功之后一定会来节贴给分,我怕我还有不懂的地方要请教。
stivenjia 2008-05-27
  • 打赏
  • 举报
回复
OpenThread
获取线程句柄但要求你有该线程的ID
快乐鹦鹉 2008-05-27
  • 打赏
  • 举报
回复
如果是函数的话,你定义一个全局函数,然后作为AfxBeginThread的参数。
快乐鹦鹉 2008-05-27
  • 打赏
  • 举报
回复
你用AfxBeginThread就可以创建线程了。
具体使用方式看这个函数的说明。可以创建函数线程和类线程。
我这里只有类线程的例子:
m_pDGPSThread=(CDGPSThread*)AfxBeginThread(RUNTIME_CLASS(CDGPSThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
m_pDGPSThread->ResumeThread();
一般在线程类中帮定一个对话框,用于进行消息循环。

#if !defined(AFX_DGPSTHREAD_H__A3642D5F_782A_4875_A806_269144078E76__INCLUDED_)
#define AFX_DGPSTHREAD_H__A3642D5F_782A_4875_A806_269144078E76__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DGPSThread.h : header file
//


#include "DGPSDlg.h"
/////////////////////////////////////////////////////////////////////////////
// CDGPSThread thread

class CDGPSThread : public CWinThread
{
DECLARE_DYNCREATE(CDGPSThread)
protected:
CDGPSThread(); // protected constructor used by dynamic creation

// Attributes
public:
CDGPSDlg* m_pDlg;

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDGPSThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL

// Implementation
protected:
virtual ~CDGPSThread();

// Generated message map functions
//{{AFX_MSG(CDGPSThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DGPSTHREAD_H__A3642D5F_782A_4875_A806_269144078E76__INCLUDED_)

stivenjia 2008-05-27
  • 打赏
  • 举报
回复
SuspendThread //线程挂起
ResumeThread //恢复运行
feng8180 2008-05-27
  • 打赏
  • 举报
回复
怎么没人回答了。很急,在线等。谢谢各位。
feng8180 2008-05-27
  • 打赏
  • 举报
回复
额。如果建立了子线程,怎么把程序写进这个线程去,怎么停止和恢复线程。有没有例子。谢谢。
feng8180 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyparrot 的回复:]
引用 2 楼 feng8180 的回复:
我在做一个和电机相关的程序,定时器是个安全措施,要求始终都在运行中,而当发现有不安全的情况,如电机运动超速等等,就需要将整个程序先暂停,等修好以后,定时器发现问题排除了,在恢复主程序

如果是这种需求,那么你应该将电机运动超速这种处理开子线程来处理,定时器来停止子线程。哪有停主线程的道理。
[/Quote]
怎么把一个函数做成子线程。
详细的情况是这样:
一个对话框里有定时器和一个扫描图像函数(由按钮激活),一旦定时器发现异常就终止这个扫描函数的执行,但是最好是不退出这个对话框。然后解除报警后,还能手动按按钮继续扫描。
按您的说法,也可以我把这扫描的函数放到另一个子线程里,这样可行吗?
scq2099yt 2008-05-27
  • 打赏
  • 举报
回复
支持鹦鹉兄的:
将电机运动超速这种处理开子线程来处理,定时器来停止子线程。
lake_cx 2008-05-27
  • 打赏
  • 举报
回复
执行任何一个函数时,所谓的“主线程”都是“挂起”的,所谓“不挂起”,是函数执行得太快,一下可以执行N多函数,让界面很快可以响应
cnzdgs 2008-05-27
  • 打赏
  • 举报
回复
执行定时器的回调函数时,所谓的“主线程”是“挂起”的,所以你不必做暂停和恢复的处理。
snow1313113 2008-05-27
  • 打赏
  • 举报
回复
SetTimer不会新建一个线程,只会定时发送WM_TIMER消息,最后还是你调用SetTimer的那个线程来处理WM_TIMER消息并调用回调函数。
快乐鹦鹉 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feng8180 的回复:]
我在做一个和电机相关的程序,定时器是个安全措施,要求始终都在运行中,而当发现有不安全的情况,如电机运动超速等等,就需要将整个程序先暂停,等修好以后,定时器发现问题排除了,在恢复主程序
[/Quote]
如果是这种需求,那么你应该将电机运动超速这种处理开子线程来处理,定时器来停止子线程。哪有停主线程的道理。
feng8180 2008-05-27
  • 打赏
  • 举报
回复
晕...那我新建一个线程,在把定时器放到这个线程里可以吗?
加载更多回复(5)

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧