当前位置: 技术问答>linux和unix
100分求解,不够在加!进程间通信问题,高手请进!
来源: 互联网 发布时间:2016-06-17
本文导语: 我在一个进程(proc1)中对sdl进行初始等操,如下 //proc1.c SDL_Event WndEvent; SDL_Surface *_Screen ; SDL_VideoInfo *_pInfo; SDL_PixelFormat * _pVfmt; void main(int argc,char* args[]) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) format; w...
我在一个进程(proc1)中对sdl进行初始等操,如下
//proc1.c
SDL_Event WndEvent;
SDL_Surface *_Screen ;
SDL_VideoInfo *_pInfo;
SDL_PixelFormat * _pVfmt;
void main(int argc,char* args[])
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) format;
while (SDL_WaitEvent(&WndEvent))
{
..............
}
}
请问,我如何在另一个进程中(proc2)对第一个进程(proc1)中的_Sreen进程操做(如想画一个矩形等操作)那?
如
//proc2.c
void main(int argc,char* args[])
{
SDL_UpdateRect(_Screen,p ->x,p ->y,p ->cx, p ->cy);//注意,这里的_Screen应是在proc1中定义的
}
我现在已经将_Screen共享了(用共享内存的方法),可是在proc2中对_Screen操作时就会出错(个人认为sdl是在proc1中初始化,proc2中没有初始化),请高手指点!
//proc1.c
SDL_Event WndEvent;
SDL_Surface *_Screen ;
SDL_VideoInfo *_pInfo;
SDL_PixelFormat * _pVfmt;
void main(int argc,char* args[])
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) format;
while (SDL_WaitEvent(&WndEvent))
{
..............
}
}
请问,我如何在另一个进程中(proc2)对第一个进程(proc1)中的_Sreen进程操做(如想画一个矩形等操作)那?
如
//proc2.c
void main(int argc,char* args[])
{
SDL_UpdateRect(_Screen,p ->x,p ->y,p ->cx, p ->cy);//注意,这里的_Screen应是在proc1中定义的
}
我现在已经将_Screen共享了(用共享内存的方法),可是在proc2中对_Screen操作时就会出错(个人认为sdl是在proc1中初始化,proc2中没有初始化),请高手指点!
|
根据你上边的,_Screen是个指针,它指向的数据空间应该是有SDL_SetVideoMode函数分配的,释放也是由相应的函数来指向;再着它是一个结构体指针,其结构成员也可能是指针,会分配空间。如果仅仅共享了_Screen指向的空间,那你另一个进程仍然不能共享该结构的所有数据。
|
main() {
while (command = read_from_control_socket())
{
command->do();
}
}
void OpenGLCommand::do()
{
glBegin();
glXXX();
glYYY();
glEnd();
}
void FileOpCommand::do()
{
FILE *fp = fopen(...);
fclose(fp);
}
|
感觉还是用共享内存比较好
你这是不是win的,proc1做了共享内存,但proc2怎么知道它在哪里呢?
在l下,共享内存会有一个标识,改标识是在固定的路径下,让后面要读该共享内存的内容的进程知道该路径
这样,这些进程就可以知道那块内存地址在哪里了,而你这个程序中,proc2好像没有去找到那块内存区,而是
直接去访问那个变量,当然找不到了。
最好在看看,在你这个平台下共享内存怎么用的
你这是不是win的,proc1做了共享内存,但proc2怎么知道它在哪里呢?
在l下,共享内存会有一个标识,改标识是在固定的路径下,让后面要读该共享内存的内容的进程知道该路径
这样,这些进程就可以知道那块内存地址在哪里了,而你这个程序中,proc2好像没有去找到那块内存区,而是
直接去访问那个变量,当然找不到了。
最好在看看,在你这个平台下共享内存怎么用的
|
典型不能这么做。进程1中设计一个接口,譬如通过 FIFO/PIPE 之类接受进程2发的消息(格式自己定义),然后执行相应的操作。简单的说就是一个 C/S 模式的架构。
|
fusion是一个多进程间实现共享的东西,本身也是C语言实现的。
|
openGL需要硬件支持的吧
|
其实fusion采用共享内存的方式是可以这样做的,不过比较复杂。
要学习不少东西。
要学习不少东西。