在不同项目之间共享的头文件中的变量



我有一个解决方案,其中包括三个项目。一种是创建静态库,即.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中几乎没有办法"在同一时刻"共享某些东西。你可以任意地接近,但计算机不是这样工作的。

考虑到所涉及的难度,是否有其他设计可以使其更清晰?为什么这些进程必须以这种方式交换信息?必须使用单独的流程来完成吗?

相关内容

  • 没有找到相关文章

最新更新