关于线程与管道 我的程序是创建了好多的线程,而且,每个线程都要创建个进程去运行一个批处理文件(都运行同一个这个文件),在这个批处理中,用到了重定向的操作符,把一些信息输出到一个文件中。问题是: 不知道我这样做,会不会相互影响,就是说: 多个线程同时运行,都在操作这个批处理文件,那结果是不是就没谱了 ? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 -->raymonzhao(Raymon) "由于你这里是多进程来做的,所以要用系统的事件来达到同步的效果。"麻烦可说的详细一些么?-------------------------------------------------------------------->tigerandrew(白虎) "可以用管道啊,也可疑用消息!"我的批处理里面是个rsh的程序,要求在远端实行一个命令,本来就用了重定向了(类似于: rsh %1 -l %2 >> %3 2>&1 ),会不会冲突呢? 还有就是,我用CreateThread()创建的线程,如 创建1,创建2,创建3,创建4,4个线程都被创建好了,第一个时间片时会依次运行,但由于其调度顺序由系统分配,且优先级也是相同的,所以第2轮时间片是不是就不确定了?就是说:可能Thread1运行完,Thread2运行完, Thread4开始运行,然后Thread3运行 ?如果是,那该如何控制让它依次运行呢?就是按照创建顺序: Thread1, Thread2,Thread3,Thread4。 ??? Thread1, Thread2,Thread3,Thread4依次运行,那不如在一个线程写上这四个线程的代码。》》》多个线程同时运行,都在操作这个批处理文件,那结果是不是就没谱了 ?应该是某个线程的执行结果,因为任何一个线程都是以读方式打开文件的。如果当时别的线程在写结果,此时线程被切换盗别的线程,那么第二个线程就打不开文件了。 -->hxfjb(New人) 由于要动态生成线程的个数,就是根据命令行决定起几个线程,所以只好一个一个来。“应该是某个线程的执行结果,”, 我该如何控制让它把每一个的结果都依次显示出来呢?就是按照1,2,3,4的顺序。 DWORD WINAPI Thread2(LPVOID lp){ WaitForSingleObject(hThread1); ...}DWORD WINAPI Thread3(LPVOID lp){ WaitForSingleObject(hThread2); ...}DWORD WINAPI Thread4(LPVOID lp){ WaitForSingleObject(hThread3); ...} 我用的是WaitMultSingleObject()效果应该是一样的,等全部的线程终了。可是,每个线程里面还有进程,这样会不会对结果有影响呢? 就是每个线程还要CreateProcess()来启同一个批处理文件(.bat),实际上的操作是在批处理里面进行的命令行操作 -->goyejin(柯琼攀) 知道如何解决么? -->raymonzhao(Raymon)有点深了... 我也有相似的问题,我在多线程里使用重定向输出结果,每个线程都输出到不同的文件里,可有些线程重定向的文件是空的,不知道为啥???我每个线程都有各自的重定向文件,难道多线程还不能使用同一个bat文件?高手帮忙分析分析.............. 说老实话,我还是不明白这仁兄的意思.......你不如把你的现有代码贴出来,加点说明把!实在不明白,为什么要专门建个一次性的线程来建立另外一条进程??!!!!!有必要吗?我看是不是这样的:{ CreatProcess(...);//Process1 CreatProcess(...);//Process2 CreatProcess(...);//Process3 .......}在定义进程时将你要用的互斥变量以及从定向信息交给进程他们自己处理! --> tigerandrew(白虎) 建立外面的线程是为了控制整个流程,建立里面的线程是为了用WaitForSingleObject控制某一部分操作的时间给你打个比方吧:1.一场考试就是一个main;2.共有10个学生参加,每一个学生从走进考场考试到考完走出考场都由一个线程控制(外层的线程);3.考试开始到考试结束必须严格控制时间,所以对于具体的考试过程要另起一个线程(内层的线程,一是为了实现考试这一动作,二是为了控制考试时间);4.如果考生提前答完试卷(内层线程在规定时间内结束),那么考生就可以收拾书包离开考场,离开考场的那一刻,这个考生的线程结束(外层线程结束);5.如果考试时间结束,考生还没答完试卷,那么将强制他停笔交卷(WaitForSingleObject收到time out,内层线程被中止),然后让他收拾书包离开考场(内层线程超时后的相应操作),离开考场的那一刻,这个考生的线程结束(外层线程结束);6.只有所有的考生都离开考场(全部线程结束,WaitForMultipleObjects),这场考试才算结束,才能关闭考场大门(main结束)所以,这个main里面要起10个线程来控制10个考生在考场的活动,每个线程又要起一个线程来控制考生答题的过程和时间,每个考生的答案都通过重定向发到本地主机不同的文件里保存。现在的问题是,这10个线程都运行起来了,每个考生也肯定是做完试卷了,但我们收到的有些试卷却是白卷,就是说一些线程重定向到本地主机的结果是空的,是线程不同步的问题吗?注意:必须要让10个进程同时运行,结果被实时重定向到本地主机,每个线程有各自的重定向文件 因为不是自己写的练习程序,不方便贴出代码,实在抱歉 ---> tigerandrew(白虎) 大致意思也就是楼上说的, 现在也是怀疑:流程大致是:启动线程的个数要看输入的命令行参数。Thread 1{ Process1 // 启动批处理,执行一些命令}Thread 2{ Process2 // 启动批处理,执行一些命令}...Thread 20{ Process20 // 启动批处理,执行一些命令}-------------------批处理中使用了类似于:rsh %1 %2 >>%3 >&1 的命令结果就是,有的运行的结果可以出来,有的就出不来。是不是又是线程,又是管道,没法控制? 在批处理文件中,用的是远程登录命令来执行一个操作:rsh %1 -l %2 >>%3 >&1, 这样的。 (实际操作中传给的参数是本地IP,就是rsh到本地)程序内部本身并不涉及网络。 就象上面的考试的情况,如果所有考生都是同是开始考试的话应该很简单!如果不是同时开始,可不可以这样:mian(){ for(int i=0;i<task_count;i++) { thread_id[i]=createthread(/* 将重定向信息和task内容传过到worker线程中 */); } WaitForMultipleObjects(...);}//-----------------------------------------------Thread{ processID = CreateProcess( /* 将task通过命令参数传到worker进程中*/); WaitForSingleObject(processID); return;}你看这行不? TO: tigerandrew(白虎) 基本上我们的线程结构就是你写的那样,可按顺序起线程之后,有的线程传不回结果,用重定向和管道都试过了,都不行,不知道为什么?尤其是居然管道都收不到结果,而且线程执行过程中就不是按照起线程的顺序了。有可能学生No.20最后一个被发卷却第一个被收卷,从而导致没有时间答题而交白卷,有没有方法让线程按照创建的顺序执行??顺便问一下:WaitForSingleObject() 当time out的时候,被等待的线程或进程是被强制终结,停止执行了吗? "线程执行过程中就不是按照起线程的顺序了",你是要这样吗:建立线程->线程1执行->线程2执行->...->线程1执行->线程2执行->...->线程1结束->线程2结束->...->返回结果.还有,线程运行次序本身就是os决定的在各自等待结束后,返回的顺序当然也就是不确定的.线程被terminate强行终结的话当然就会立即停止,你提到这我想,你注意一下那些没收到返回的线程和进程是不是那些超时后被强行终结的线程和进程?!我怀疑就是这个原因,因为terminate的话就是不管线程或进程运行到那个点都会被结束,而且不会发生return! 要是还没解决你看咱是不是到qq上交流,403755109,认证csdn. installshield 书籍介绍? DLL数据共享的问题 难题------图形旋转问题?????????????????----请教各位大虾??// 谁给我个vc++读取xml的例子,要用DOM,在线等 请教如何能将视频采集卡采集到的视频翻转? 一个关于listcontrol控件的问题 请教:如何在vc7.1编译vc6的程序 大虾!可以帮个忙吗? 请大虾们给我点MFC蓝牙编程方面的资料! 求封装了mscomm功能的dll 在tabcontrol 中如何在一个page中访问另一个page中的数据? 谢谢 100分求助!debug正常,release运行错误,在线等!!急!!
"由于你这里是多进程来做的,所以要用系统的事件来达到同步的效果。"麻烦可说的详细一些么?
------------------------------------------------------------------
-->tigerandrew(白虎)
"可以用管道啊,也可疑用消息!"
我的批处理里面是个rsh的程序,要求在远端实行一个命令,
本来就用了重定向了(类似于: rsh %1 -l %2 >> %3 2>&1 ),会不会冲突呢?
如 创建1,创建2,创建3,创建4,
4个线程都被创建好了,第一个时间片时会依次运行,但由于其调度顺序由系统分配,且优先级也是相同的,所以第2轮时间片是不是就不确定了?就是说:可能Thread1运行完,Thread2运行完, Thread4开始运行,然后Thread3运行 ?
如果是,那该如何控制让它依次运行呢?
就是按照创建顺序: Thread1, Thread2,Thread3,Thread4。
???
》》》多个线程同时运行,都在操作这个批处理文件,那结果是不是就没谱了 ?
应该是某个线程的执行结果,因为任何一个线程都是以读方式打开文件的。如果当时别的线程在写结果,此时线程被切换盗别的线程,那么第二个线程就打不开文件了。
由于要动态生成线程的个数,就是根据命令行决定起几个线程,所以只好一个一个来。
“应该是某个线程的执行结果,”, 我该如何控制让它把每一个的结果都依次显示出来呢?
就是按照1,2,3,4的顺序。
{
WaitForSingleObject(hThread1);
...
}DWORD WINAPI Thread3(LPVOID lp)
{
WaitForSingleObject(hThread2);
...
}DWORD WINAPI Thread4(LPVOID lp)
{
WaitForSingleObject(hThread3);
...
}
可是,每个线程里面还有进程,这样会不会对结果有影响呢?
实际上的操作是在批处理里面进行的命令行操作
知道如何解决么?
有点深了...
实在不明白,为什么要专门建个一次性的线程来建立另外一条进程??!!!!!有必要吗?
我看是不是这样的:
{
CreatProcess(...);//Process1
CreatProcess(...);//Process2
CreatProcess(...);//Process3
.......
}在定义进程时将你要用的互斥变量以及从定向信息交给进程他们自己处理!
建立外面的线程是为了控制整个流程,建立里面的线程是为了用WaitForSingleObject控制某一部分操作的时间给你打个比方吧:
1.一场考试就是一个main;
2.共有10个学生参加,每一个学生从走进考场考试到考完走出考场都由一个线程控制(外层的线程);
3.考试开始到考试结束必须严格控制时间,所以对于具体的考试过程要另起一个线程(内层的线程,一是为了实现考试这一动作,二是为了控制考试时间);
4.如果考生提前答完试卷(内层线程在规定时间内结束),那么考生就可以收拾书包离开考场,离开考场的那一刻,这个考生的线程结束(外层线程结束);
5.如果考试时间结束,考生还没答完试卷,那么将强制他停笔交卷(WaitForSingleObject收到time out,内层线程被中止),然后让他收拾书包离开考场(内层线程超时后的相应操作),离开考场的那一刻,这个考生的线程结束(外层线程结束);
6.只有所有的考生都离开考场(全部线程结束,WaitForMultipleObjects),这场考试才算结束,才能关闭考场大门(main结束)所以,这个main里面要起10个线程来控制10个考生在考场的活动,每个线程又要起一个线程来控制考生答题的过程和时间,每个考生的答案都通过重定向发到本地主机不同的文件里保存。现在的问题是,这10个线程都运行起来了,每个考生也肯定是做完试卷了,但我们收到的有些试卷却是白卷,就是说一些线程重定向到本地主机的结果是空的,是线程不同步的问题吗?注意:必须要让10个进程同时运行,结果被实时重定向到本地主机,每个线程有各自的重定向文件
大致意思也就是楼上说的, 现在也是怀疑:
流程大致是:启动线程的个数要看输入的命令行参数。
Thread 1
{
Process1 // 启动批处理,执行一些命令
}
Thread 2
{
Process2 // 启动批处理,执行一些命令
}
.
.
.
Thread 20
{
Process20 // 启动批处理,执行一些命令
}
-------------------
批处理中使用了类似于:rsh %1 %2 >>%3 >&1 的命令结果就是,有的运行的结果可以出来,有的就出不来。是不是又是线程,又是管道,没法控制?
rsh %1 -l %2 >>%3 >&1, 这样的。 (实际操作中传给的参数是本地IP,就是rsh到本地)
程序内部本身并不涉及网络。
如果不是同时开始,可不可以这样:
mian()
{ for(int i=0;i<task_count;i++)
{
thread_id[i]=createthread(/* 将重定向信息和task内容传过到worker线程中 */);
} WaitForMultipleObjects(...);}//-----------------------------------------------Thread
{
processID = CreateProcess( /* 将task通过命令参数传到worker进程中*/);
WaitForSingleObject(processID);
return;
}
你看这行不?
线程被terminate强行终结的话当然就会立即停止,你提到这我想,你注意一下那些没收到返回的线程和进程是不是那些超时后被强行终结的线程和进程?!我怀疑就是这个原因,因为terminate的话就是不管线程或进程运行到那个点都会被结束,而且不会发生return!