劳驾,怎么用c或c++模拟windows多进程?

时间:2021-01-14 16:43:40
(2003-11-13 20:16:44)   凤凰焰(274899734)
比如说有两个进程
   1。不断计算1+2+3。。。+nNum=>nSum
   2.等待用户输入一个字符chChar,如果它的值为'p',则输出此时nSum的值
   如何办到这一点?

17 个解决方案

#1


搞笑,这哪需要什么多进程,这样就可以了:
int sum = 0;
int i = 1;
while(getkey() != 'p')
  sum += i++;
std::cout << sum << std::endl;

#2


我那个例子只是打一个比方而已
而且如果不用getkey() 函数,那又该怎么实现呢?
   或者问getkey()它的原理又是什么呢?

#3


getkey() 是哪里的函数?
多线程是操作系统相关的,应该很难在语言中模拟。。。怀疑 boost 的多线程库还就是对系统 API 的封装(不清楚,知道的请指正)

#4


刚刚按照楼主的要求写了一个多线程的东东实现他的要求,我猜想楼主是想了解一下多线程程序的结构吧,不过楼主的“多进程”我看就没有这个必要了吧。

太粗糙了,大家见笑了。

#include <unistd.h>
#include <conio.h>
#include <windows.h>

#include <iostream>

HANDLE han;

using namespace std;

long nSum = 0;
long nNum = 1;

bool _ifStop_ = false;

void count(void *para)
{
    cout<<1; 
    for(;;)
    {
        if(_ifStop_)
        {
            
            cout<<"="<<nSum<<endl;
            exit(0);
        }
        else
        {
            nSum += nNum;
            cout<<"+"<<nNum;
            nNum ++;
        }
    }
}
void control(void *para)
{
    char c;
    for(;;)
    {
        Sleep(100);
        c=getch();
        if('p' == c || 'P' == c)
        {
        _ifStop_  = true;  
}
    }
}

int main( int argv , char *argc[] )
{



HANDLE handle=(HANDLE)_beginthread(control, 0, (void *)0 );

HANDLE handle1=(HANDLE)_beginthread(count, 0, (void *)0 );

ExitThread(1);

han=GetCurrentThread();

return 1;
}

#5


不好意思,按照我刚才写的,CPU的使用量会到100%
改一下:

#include <unistd.h>
#include <conio.h>
#include <windows.h>

#include <iostream>

HANDLE han;

using namespace std;

long nSum = 0;
long nNum = 1;

bool _ifStop_ = false;

void count(void *para)
{
    cout<<1; 
    for(;;)
    {
        Sleep(1);           //添加了这句
        if(_ifStop_)
        {
            
            cout<<"="<<nSum<<endl;
            exit(0);
        }
        else
        {
            nSum += nNum;
            cout<<"+"<<nNum;
            nNum ++;
        }
    }
}
void control(void *para)
{
    char c;
    for(;;)
    {
        Sleep(100);
        c=getch();
        if('p' == c || 'P' == c)
        {
        _ifStop_  = true;  
}
    }
}

int main( int argv , char *argc[] )
{

HANDLE handle=(HANDLE)_beginthread(control, 0, (void *)0 );
HANDLE handle1=(HANDLE)_beginthread(count, 0, (void *)0 );
ExitThread(1);
han=GetCurrentThread();
return 1;
}

#6


这样虽然理论上有延时,但是能让CPU "不疼不痒" 地运作。

#7


up

#8


你的说法已经把“代码”和“操作系统元素”混淆起来了。
C++作为计算机语言,它没有所谓多进程或线程的概念。只是在特定的操作系统中,我们需要调用这样的操作系统函数来创建操作系统支持的元素进行工作,而所谓_begintheadex,_endthreadex不过是C++在各个操作系统函数之上的一个brige(桥接)。

#9


谢谢前辈指教。

#10


谢谢各位了^_^,不过俺还有几句话要说
1. to Wolf0403(完美废人) :
     那个函数在<conio.h>中
2. to Analyst():
    (1)函数的拼写你记错了,不是getkey(),是getch().
    (2)运行你的程序:
          #include <conio.h>
          #include <iostream.h>
          void main()
          {  
       int a = 0;
                while (getch() != 'p')
                          a++;
                cout<<a<<endl;
 }
          发现并未实现“sum的加法运算与接收键盘输入”同时进行的功能
          实际的运行情况是:当我输入一个字母后,它才判断并输出。(仍存在先后的顺序)
3.to siegf(nowhy!) :
     首先感谢你给大家提供了一个样本程序,然后  
     不知道是什么回事,我用vc++6.0编译你的这个程序,显示找不到'unistd.h'
              Cannot open include file: 'unistd.h': No such file or directory

#11


我自己来顶一下

#12


unistd.h 不知道是哪里的。。。

getch 是 conio.h 中的(也是一个非标准库的头文件。。。)
getkey 可能是有效的,和 getch 不同。但是至少我手边没有可以用的 getkey 函数。

#13


没有人来了吗?555555

#14


MARK

#15


我所用的 unistd.h 是 DEV-CPP 中有的一个头文件。

如果你想在 VC 中实现 这个,你可以参考一下 北京大学翻译出版社出版的《Windows 程序设计》里面第20章有详细的阐述和实例。

#16


实际上如果是基本的模拟的话可以完全不用_beginthream
明确的说就是如果你模拟的不同线程中没有会占用很长时间的IO操作的话
简单地使用以下方式就行:
int thread1(void *arg = 0) {
    …… …… ……
}
int thread2(void *arg = 0) {
    …… …… ……
}

int main(void) {
    bool runThread1 = true;
    bool runThread2 = true;
    while(true) {
        bool running = false;
        if(runThread1) {
            if(thread1() == -1) runThread1 = false;
            else running = true;
        }
        if(runThread2) {
            if(thread2() == -1) runThread2 = false;
            else running = true
        }
        if (running) sleep(1);
        else break;
    }
}

#17


谢谢各位了^_^

#1


搞笑,这哪需要什么多进程,这样就可以了:
int sum = 0;
int i = 1;
while(getkey() != 'p')
  sum += i++;
std::cout << sum << std::endl;

#2


我那个例子只是打一个比方而已
而且如果不用getkey() 函数,那又该怎么实现呢?
   或者问getkey()它的原理又是什么呢?

#3


getkey() 是哪里的函数?
多线程是操作系统相关的,应该很难在语言中模拟。。。怀疑 boost 的多线程库还就是对系统 API 的封装(不清楚,知道的请指正)

#4


刚刚按照楼主的要求写了一个多线程的东东实现他的要求,我猜想楼主是想了解一下多线程程序的结构吧,不过楼主的“多进程”我看就没有这个必要了吧。

太粗糙了,大家见笑了。

#include <unistd.h>
#include <conio.h>
#include <windows.h>

#include <iostream>

HANDLE han;

using namespace std;

long nSum = 0;
long nNum = 1;

bool _ifStop_ = false;

void count(void *para)
{
    cout<<1; 
    for(;;)
    {
        if(_ifStop_)
        {
            
            cout<<"="<<nSum<<endl;
            exit(0);
        }
        else
        {
            nSum += nNum;
            cout<<"+"<<nNum;
            nNum ++;
        }
    }
}
void control(void *para)
{
    char c;
    for(;;)
    {
        Sleep(100);
        c=getch();
        if('p' == c || 'P' == c)
        {
        _ifStop_  = true;  
}
    }
}

int main( int argv , char *argc[] )
{



HANDLE handle=(HANDLE)_beginthread(control, 0, (void *)0 );

HANDLE handle1=(HANDLE)_beginthread(count, 0, (void *)0 );

ExitThread(1);

han=GetCurrentThread();

return 1;
}

#5


不好意思,按照我刚才写的,CPU的使用量会到100%
改一下:

#include <unistd.h>
#include <conio.h>
#include <windows.h>

#include <iostream>

HANDLE han;

using namespace std;

long nSum = 0;
long nNum = 1;

bool _ifStop_ = false;

void count(void *para)
{
    cout<<1; 
    for(;;)
    {
        Sleep(1);           //添加了这句
        if(_ifStop_)
        {
            
            cout<<"="<<nSum<<endl;
            exit(0);
        }
        else
        {
            nSum += nNum;
            cout<<"+"<<nNum;
            nNum ++;
        }
    }
}
void control(void *para)
{
    char c;
    for(;;)
    {
        Sleep(100);
        c=getch();
        if('p' == c || 'P' == c)
        {
        _ifStop_  = true;  
}
    }
}

int main( int argv , char *argc[] )
{

HANDLE handle=(HANDLE)_beginthread(control, 0, (void *)0 );
HANDLE handle1=(HANDLE)_beginthread(count, 0, (void *)0 );
ExitThread(1);
han=GetCurrentThread();
return 1;
}

#6


这样虽然理论上有延时,但是能让CPU "不疼不痒" 地运作。

#7


up

#8


你的说法已经把“代码”和“操作系统元素”混淆起来了。
C++作为计算机语言,它没有所谓多进程或线程的概念。只是在特定的操作系统中,我们需要调用这样的操作系统函数来创建操作系统支持的元素进行工作,而所谓_begintheadex,_endthreadex不过是C++在各个操作系统函数之上的一个brige(桥接)。

#9


谢谢前辈指教。

#10


谢谢各位了^_^,不过俺还有几句话要说
1. to Wolf0403(完美废人) :
     那个函数在<conio.h>中
2. to Analyst():
    (1)函数的拼写你记错了,不是getkey(),是getch().
    (2)运行你的程序:
          #include <conio.h>
          #include <iostream.h>
          void main()
          {  
       int a = 0;
                while (getch() != 'p')
                          a++;
                cout<<a<<endl;
 }
          发现并未实现“sum的加法运算与接收键盘输入”同时进行的功能
          实际的运行情况是:当我输入一个字母后,它才判断并输出。(仍存在先后的顺序)
3.to siegf(nowhy!) :
     首先感谢你给大家提供了一个样本程序,然后  
     不知道是什么回事,我用vc++6.0编译你的这个程序,显示找不到'unistd.h'
              Cannot open include file: 'unistd.h': No such file or directory

#11


我自己来顶一下

#12


unistd.h 不知道是哪里的。。。

getch 是 conio.h 中的(也是一个非标准库的头文件。。。)
getkey 可能是有效的,和 getch 不同。但是至少我手边没有可以用的 getkey 函数。

#13


没有人来了吗?555555

#14


MARK

#15


我所用的 unistd.h 是 DEV-CPP 中有的一个头文件。

如果你想在 VC 中实现 这个,你可以参考一下 北京大学翻译出版社出版的《Windows 程序设计》里面第20章有详细的阐述和实例。

#16


实际上如果是基本的模拟的话可以完全不用_beginthream
明确的说就是如果你模拟的不同线程中没有会占用很长时间的IO操作的话
简单地使用以下方式就行:
int thread1(void *arg = 0) {
    …… …… ……
}
int thread2(void *arg = 0) {
    …… …… ……
}

int main(void) {
    bool runThread1 = true;
    bool runThread2 = true;
    while(true) {
        bool running = false;
        if(runThread1) {
            if(thread1() == -1) runThread1 = false;
            else running = true;
        }
        if(runThread2) {
            if(thread2() == -1) runThread2 = false;
            else running = true
        }
        if (running) sleep(1);
        else break;
    }
}

#17


谢谢各位了^_^