我有一个包含三个项目的解决方案。一个是创建静态库,即.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);
}
答案 0 :(得分:0)
您需要查看如何在运行应用程序的操作系统中进行进程间通信。 (此时我假设进程在同一台计算机上运行。)看起来你正在使用Windows(基于看到&#34; MessageBox&#34的调用;)所以最简单的方法是两个使用RegisterWindowMessage的进程都创建一个通常理解的消息值,然后使用PostMessage或SendMessage通过LPARAM发送数据。 (你需要每个人都能获得另一个人的窗口句柄,这相当容易。)你想在两个进程中都有某种排除机制(互斥或关键部分),以确保共享值不能同时读取和写入。如果两个流程都可以进行&#34;更改和交换&#34;如果两个人同时尝试这样做,你就会有一个有趣的问题需要解决,因为你必须处理这个共享值死锁的可能性。
您也可以使用共享内存,但需要更多参与。
如果进程位于不同的计算机上,则需要通过TCP / IP或TCP / IP之上的协议来完成。你可以使用pub-sub安排 - 或任何数量的东西。如果不了解您正在尝试完成的内容,就很难知道要推荐什么。
(为了记录,在多进程/多线程操作系统中几乎没有办法在同一时刻共享某些东西&#34;&#34;你可以随意关闭,但计算机不能和#39; t就是那样工作。)
考虑到所涉及的难度,是否还有其他一些设计可能会让这个更清洁?为什么这些流程必须以这种方式交换信息?必须使用单独的流程吗?