我有一个解决方案,其中包括三个项目。一种是创建静态库,即.lib文件。它包含一个头文件main.h和一个main.cpp文件。CPP文件包含头文件的函数定义。
第二个项目是。exe项目,它包含头文件main.h并调用头文件的一个函数。
第三个项目也是一个.exe项目,它包含头文件,并使用头文件的可变标志。
现在两个。exe项目都在创建变量的不同实例。但我想动态地在项目之间共享相同的变量实例。因为我必须在同一时刻将一个项目生成的值映射到另一个项目。
请帮助我,因为我的项目快到最后期限了。
谢谢你的帮助。
下面是部分代码。
main.cpp和main.h是.lib项目的文件
main.h
extern int flag;
extern int detect1(void);
main.cpp
#include<stdio.h>
#include"main.h"
#include <Windows.h>
#include <ShellAPI.h>
using namespace std;
using namespace cv;
int flag=0;
int detect1(void)
{
int Cx=0,Cy=0,Kx=20,Ky=20,Sx=0,Sy=0,j=0;
//create the cascade classifier object used for the face detection
CascadeClassifier face_cascade;
//use the haarcascade_frontalface_alt.xml library
face_cascade.load("E:\haarcascade_frontalface_alt.xml");
//System::DateTime now = System::DateTime::Now;
//cout << now.Hour;
//WinExec("E:\FallingBlock\FallingBlock\FallingBlock\bin\x86\Debug\FallingBlock.exe",SW_SHOW);
//setup video capture device and link it to the first capture device
VideoCapture captureDevice;
captureDevice.open(0);
//setup image files used in the capture process
Mat captureFrame;
Mat grayscaleFrame;
//create a window to present the results
namedWindow("capture", 1);
//create a loop to capture and find faces
while(true)
{
//capture a new image frame
captureDevice>>captureFrame;
//convert captured image to gray scale and equalize
cvtColor(captureFrame, grayscaleFrame, CV_BGR2GRAY);
equalizeHist(grayscaleFrame, grayscaleFrame);
//create a vector array to store the face found
std::vector<Rect> faces;
//find faces and store them in the vector array
face_cascade.detectMultiScale(grayscaleFrame, faces, 1.1, 3, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, Size(30,30));
//draw a rectangle for all found faces in the vector array on the original image
for(unsigned int i = 0; i < faces.size(); i++)
{
Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
Point pt2(faces[i].x, faces[i].y);
rectangle(captureFrame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);
if(faces.size()>=1)
j++;
Cx = faces[i].x + (faces[i].width / 2);
Cy = faces[i].y + (faces[i].height / 2);
if(j==1)
{
Sx=Cx;
Sy=Cy;
flag=0;
}
}
if(Cx-Sx > Kx)
{
flag = 1;
printf("%d",flag);
}
else
{
if(Cx-Sx < -Kx)
{
flag = 2;
printf("%d",flag);
//update(2);
}
else
{
if(Cy-Sy > Ky)
{
flag = 3;
printf("%d",flag);
//update(3);
}
else
{
if(Cy-Sy < -Ky)
{
flag = 4;
printf("%d",flag);
//update(4);
}
else
if(abs(Cx-Sx) < Kx && abs(Cy-Sy)<Ky)
{
flag = 0;
printf("%d",flag);
//update(0);
}
}
}
}
2nd project's code
face.cpp
#include"main.h"
#include<stdio.h>
int main()
{
detect1();
}
3rd project's code
tetris.cpp
#include"main.h"
int key;
key = flag;
if(key==0)
{
MessageBox(hwnd,"Space2","TetRiX",0);
}
if(key==4)
{
tetris.handleInput(1);
tetris.drawScreen(2);
//MessageBox(hwnd,"Space2","TetRiX",0);
}
您需要查找如何在运行应用程序的操作系统中进行进程间通信。(此时,我假设这两个进程运行在同一台计算机上。)看起来你正在使用Windows(基于看到对"MessageBox"的调用),所以最简单的方法是两个进程使用RegisterWindowMessage创建一个普遍理解的消息值,然后通过LPARAM使用PostMessage或SendMessage发送数据。(您需要它们中的每一个来获得另一个的窗口句柄,这相当容易。)您可能希望在两个进程中都有某种排除机制(互斥锁或临界区),以确保共享值不能同时被读写。如果两个进程都可以进行"更改和交换",那么如果两个进程同时尝试这样做,您将有一个有趣的问题要解决,因为您将不得不处理共享值上死锁的可能性。
您也可以使用共享内存,但这有点复杂。
如果进程在不同的计算机上,你需要通过TCP/IP或TCP/IP之上的协议来完成。你可以使用pub-sub协议,或者其他任何方式。如果你不知道自己到底想要实现什么,就很难知道该推荐什么。
(请注意,在多进程/多线程O/S中几乎没有办法"在同一时刻"共享某些东西。你可以任意地接近,但计算机不是这样工作的。考虑到所涉及的难度,是否有其他设计可以使其更清晰?为什么这些进程必须以这种方式交换信息?必须使用单独的流程来完成吗?