如何在我的程序中适时中止执行的某个任务?

sun49 2004-12-15 11:33:33
我是新手,对于如何创建线程等一片空白,现有如下问题,请高手们尽可能写详细解决的方法,
谢谢!

程序功能是把所有选择的文件逐一将其每页的内容显示出来,当我发现某个文件的页面显示有问题
时,能及时停下来返回该页查看,请问,该如何设置线程来监视我的中止操作?目前为止我还没有
使用这个功能,因此在显示的时候只能等所有的页面显示完后才能返回查看,很不方便。

代码大致如下:
for (int i = 0; i < iFileCount; i++) // iFileCount为文件的个数

... // 得到文件名
for (int i = iStart; i < iStop; i++)
{
... // 这里是显示页面的循环,从iStart页开始显示
}
...

界面上另设一个按钮用于随时中止循环的显示,请问该如何建立线程监视???

另:如果有详细说明如何创建线程、使用线程的文章也请贴出来,再次谢谢!
...全文
123 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun49 2004-12-16
  • 打赏
  • 举报
回复
To:norsd(norsd)

谢谢你的代码演示,现在有了大概的思路了,程序已经改过,按你的写法试了一下,还有一个问题,就是在CreateThread是,总是提示这样的错误信息:“error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)'”,这个是什么意思啊?

我的写法和你的基本相似,在主界面按钮按下时开启线程:
DWORD dwID;
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)File_Test, this, 0, &dwID);
HanZhu1 2004-12-16
  • 打赏
  • 举报
回复
主线程上是不能做 ,大循环的, 这是必须的, 不然, 有你的苦头啊
norsd 2004-12-16
  • 打赏
  • 举报
回复
大哥,根据你的描述,windows的编程书应该多看看,一般很少人会说不会用afxbeginthread......
你就用CreateThread这个函数吧........

偶简单的说一下,你的疑惑:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
AfxBeginThread开始一个线程,现在问题出现了,原先写在这个函数里的变量全不能使用了,是不是要设成全局变量?可我也设了为什么还是不能用?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

一旦开辟了一个新的线程,那么这个线程可以使用的变量一般只有两种,1.全局变量 2.线程中的变量(包括函数的参数)。

ok, 偶知道大哥你现在问了,那我以前的函数里的变量怎么给新线程看到阿!?
一个超级简单的办法就是:
把那个类的实例指针,一股脑的作为参数传给新线程,如下:


long WINAPI NewThread( MyClassName* pMyClass);




void CMyDialog::OnBnClickedOk()
{
DWORD m_dwID;
HANDLE m_hThread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) NewThread,this/*这样就把这个类的指针传到NewThread中去了*/,0,&m_dwID);
}



long WINAPI NewThread( MyClassName* pMyClass)
{
pMyClass->m_MemberVar = .......;
}


说了那么多,口也干了,去喝杯水先.......
norsd 2004-12-16
  • 打赏
  • 举报
回复
我知道了,这是因为的你的主线程的代码中的循环占用了过多的cpu时间,使得界面无法响应消息,解决的办法就是把那个循环放到一个新的线程中去,这样可以比较圆满的解决问题。

但是一个新的问题会产生,你必须设置一些标志位变量,来指示或者控制线程执行的状态。
如果为了安全的话可以用event来避免冲突。(<---一般的小线程也不会怎么需要event啦,汗。因为标志变量少,所以倒霉的概率很小,活活)
sun49 2004-12-16
  • 打赏
  • 举报
回复
晕倒啊,原来不是程序的问题,是函数的命名有点问题,我把上面的File_Test改成不加下划线的ThreadProc就行了,有点怪,难道在线程处理中调用的函数名不能使用下划线吗?

还有,当线程里的数据处理完后,是不是一定要把线程Kill掉?用哪种Kill方式比较好?
property1 2004-12-15
  • 打赏
  • 举报
回复
<Windows核心编程> 应该看看, 网上到处都有下载,
买一本 大概 60 几快钱, 物有所值
oyljerry 2004-12-15
  • 打赏
  • 举报
回复
设置一个标志Flag
kingzai 2004-12-15
  • 打赏
  • 举报
回复
www.codeproject.com/threads/usingworkerthreads. asp?df=100&forumid=688&exp=0&select=840605
DentistryDoctor 2004-12-15
  • 打赏
  • 举报
回复
建议楼主仔细阅读<Windows核心编程>
sun49 2004-12-15
  • 打赏
  • 举报
回复
现在的问题是,只要我的循环一开始,主界面的按钮都无法按动,所以才会考虑到使用线程来控制,今天试了试问题多多,我在主窗口的OnInitDialog里建了个线程,在主界面上的一个按钮里用AfxBeginThread开始一个线程,现在问题出现了,原先写在这个函数里的变量全不能使用了,是不是要设成全局变量?可我也设了为什么还是不能用?还有,AfxBeginThread这个函数实在是不会使用,不知道哪个高手能给我解释一下比较详细的用法,谢谢.
MZP 2004-12-15
  • 打赏
  • 举报
回复
可以设置一个event,在循环处判断event。
按扭响应函数对event赋值。

查一下这两个函数
WaitForSingleObject
CreateEvent

sun49 2004-12-15
  • 打赏
  • 举报
回复
谢谢。

不过上面的问题有没有现成点的解决办法?知道的话请说明一下,有实现的过程就行,至于如果创建我自己去找资料,谢谢!

15,467

社区成员

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

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