反复创建线程的堆栈问题 why?你难道不能用线程池~而且你应该让B正常退出!,切忌! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以用线程池啊,减少系统开销还有就是最好不要用TerminateThread强制终止线程 谢谢,这么快回复。如果了解RTOS,就知道,RTOS得没有task基本上都是下面的格式void tak_a(){ init(); while(1){ ********** ********** tsk_dly(5); //这个task休息5ms,让别的task执行。 }}没个task等待执行的方式,有多种,有时间等待,也有等待某个事件(比如等待邮件)n多的task中,有一个是控制task,这个task对于别的task有生杀大权。当系统断电时,这个控制task会关闭所有task,然后自己退出。 如果了解RTOS,就知道,RTOS得没有task基本上都是下面的格式==〉 的每个 用ExitThread关闭线程,等待其安全退出 CreateEventSetEvent在线程里wait for single or multi object To:Tr0j4nExitThread这个API只能关闭自线程,也就是我上面说的B线程自己调用,才能关闭,这个方案行不通。To:xdljf利用消息来处理调度,这个可能是比较行的通的方案。但是,如果可以强制回收资源,这是最好的,也是最可靠的。因为变动不能太大,首先考虑用最单纯的方法解决问题,哪怕这个单纯的方法很复杂,但是至少这个复杂的方法,对于整个系统而言是单纯的。 To:oLINo那你线程的资源申请要做到A线程能访问,在强制结束B之前,释放这些资源〉〉这个方法可行,能不能告诉我具体的方法,比如1。如何将B线程的资源申请到A中2。如果释放这些资源给我API就可以。或者关键字。 13楼的说法不敢苟同。线程的堆栈其实别的线程完全可以修改访问,只要用到Debug API就可以了。线程B所有申请的资源都都由A管理。比如Heap、Handle等,Heap管理有HeapCreate、HeapAlloc、之类的(更详细请查MSDN)。如果你对线程B的内存不放心,可以自己管理(C++默认的new使用的是HeapAlloc,在它的crt堆上)线程B申请的资源都保存其地址和类型、申请的线程ID,到一个全局的list,干掉线程后去全局list里查找,把相关的资源释放。 强制回收业不是不可以。麻烦了。每次都到堆上创建,然后记下指针和大小,手工调用HeapFree进行释放你恐怕需要一个全局区逐个标记这些资源了,如果资源种类不多的话还好 为什么要反复创造是为了完成什么功能? 直接挂起来不行吗? 用标志位加waitfor就可以正常退出了。 到底是在嵌入式的RTOS上还是Windows上?不同的系统有自己的一套设施。 嵌入式的RTOS要移植到windows上。为了是嵌入式的应用程序在windows上执行。**嵌入式**| | **Windows**--APP----| |--APP--------RTOS---| ==>> |--RTOS-------MCU----| |--WINDOWS--上图结构所示,APP层,和 RTOS本身的代码是可以测试的。具体大家不用关注应用,解释起来很麻烦。有没有办法,强制回收资源? 我有两个疑问:1,线程B,也就是需要反复创建的,执行的是不是一种无限循环,没有出口的任务,所以线程A只能强制终结B,而B不能主动去结束?2,RTOS有自己的独特的环境,在Windows下有其他的实现途径,你有没有考虑过使用线程池?有没有考虑过使用信号量,事件等设施让B知道自己必须退出? 第一个问题:B线程不可能自己退出,RTOS中的每个Task是一个无限循环,没办法是它退出。因为Task得代码不能修改。第二个问题:现在每一个Task就是一个线程,Windows上线程的退出方式,最好就是自己退出,而这一点现在做不到,因为,RTOS是实时打断方式,比如Task B执行到一半,很有可能就让出执行权,给优先级高的task A执行,而这个优先级高的task A,突然发现了某一个信号,然后他负责杀死Task B,在RTOS中杀死的方式,就是不在调度这个task B,也就是Task B不在等待队列中。接下来Task A,发现信号恢复,重新创建Task B,而在嵌入式中,只需要将,pc指针,以及sp指针初始化就可以。记住Task B被杀以后,Task B 是有可能停留在任何地方的,也就是PC指针可能指向到Task B得while循环的任何地方,如果在windows上,使用消息通知B,使它关闭,一旦Resume Task B得线程,B线程必然继续由上次停止的地方开始,继续往下执行,这样就有可能发生错误,因为嵌入式原系统设计中,认为此时B不能被执行。它必须停止。不知道,我有没有说明白。。 那么Task申请的资源方式也无法更改了吧?无论如何你 Thread来模拟Task,强制结束的话一定会泄漏资源的。我觉得你还是用Process来模拟Task比较好,Windows操作系统能够保证,进程结束的时候它所申请的所有资源都会被释放。当然对Dll维护全局数据可能造成一定影响,不过基本上你的进程是自己写的可以注意和避免这方面的问题。 如果是完全不能修改RTOS上程序的代码就可以理解了。那我是否可以理解为你想在Windows上虚拟出一个RTOS,并在此虚拟环境下运行进程A和B?如果是这样,我建议你在这个虚拟层上分配资源,然后交付RTOS中的A和B使用。强制结束线程没关系,只要保证资源“好借好还再借不难”即可。让这个虚拟机来向windows申请资源,A和B可以强制结束,到最后虚拟机退出的时候,再归还资源。 这个基本上是不可能的,目前系统有30几个task,况且,task间还要通信,很麻烦。 对话框上放置ScrollView显示图片闪烁的问题~~ 请问各位,在公司上班,如果老板没有安排事做,那都做些什么?! 在BHO里怎能么访问INI文件? 关于透明窗体的问题,高手请进! ado的异常类是什么不用_com_error 如何取得Param中的值 怪问题! 奇问题! 特问题! 要对比较大的单色位图取点阵,有无比较好的方法?参与有分 谁有发送E-main的源代码 如何用端口方式读取研华1711采集卡? 因头文件而引起的编译错误,改到快吐血了还是不行!!! 基于视频的车辆检测方面问题
还有就是最好不要用TerminateThread强制终止线程
如果了解RTOS,就知道,RTOS得没有task基本上都是下面的格式
void tak_a()
{
init(); while(1){
**********
**********
tsk_dly(5); //这个task休息5ms,让别的task执行。
}
}没个task等待执行的方式,有多种,有时间等待,也有等待某个事件(比如等待邮件)
n多的task中,有一个是控制task,这个task对于别的task有生杀大权。
当系统断电时,这个控制task会关闭所有task,然后自己退出。
==〉 的每个
ExitThread这个API只能关闭自线程,也就是我上面说的B线程自己调用,才能关闭,这个方案行不通。To:xdljf
利用消息来处理调度,这个可能是比较行的通的方案。
但是,如果可以强制回收资源,这是最好的,也是最可靠的。因为变动不能太大,首先考虑用最单纯的方法解决问题,哪怕这个单纯的方法很复杂,但是至少这个复杂的方法,对于整个系统而言是单纯的。
那你线程的资源申请要做到A线程能访问,在强制结束B之前,释放这些资源
〉〉
这个方法可行,能不能告诉我具体的方法,比如
1。如何将B线程的资源申请到A中
2。如果释放这些资源给我API就可以。或者关键字。
--APP----| |--APP------
--RTOS---| ==>> |--RTOS-----
--MCU----| |--WINDOWS--上图结构所示,APP层,和 RTOS本身的代码是可以测试的。具体大家不用关注应用,解释起来很麻烦。有没有办法,强制回收资源?
1,线程B,也就是需要反复创建的,执行的是不是一种无限循环,没有出口的任务,所以线程A只能强制终结B,而B不能主动去结束?
2,RTOS有自己的独特的环境,在Windows下有其他的实现途径,你有没有考虑过使用线程池?有没有考虑过使用信号量,事件等设施让B知道自己必须退出?
不知道,我有没有说明白。。
我觉得你还是用Process来模拟Task比较好,Windows操作系统能够保证,进程结束的时候它所申请的所有资源都会被释放。当然对Dll维护全局数据可能造成一定影响,不过基本上你的进程是自己写的可以注意和避免这方面的问题。
那我是否可以理解为你想在Windows上虚拟出一个RTOS,并在此虚拟环境下运行进程A和B?
如果是这样,我建议你在这个虚拟层上分配资源,然后交付RTOS中的A和B使用。
强制结束线程没关系,只要保证资源“好借好还再借不难”即可。
让这个虚拟机来向windows申请资源,A和B可以强制结束,到最后虚拟机退出的时候,再归还资源。
这个基本上是不可能的,目前系统有30几个task,况且,task间还要通信,很麻烦。