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

时间:2014-03-29 13:51:08

标签: global-variables extern

我有一个包含三个项目的解决方案。一个是创建静态库,即.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);
}

1 个答案:

答案 0 :(得分:0)

您需要查看如何在运行应用程序的操作系统中进行进程间通信。 (此时我假设进程在同一台计算机上运行。)看起来你正在使用Windows(基于看到&#34; MessageBox&#34的调用;)所以最简单的方法是两个使用RegisterWindowMessage的进程都创建一个通常理解的消息值,然后使用PostMessage或SendMessage通过LPARAM发送数据。 (你需要每个人都能获得另一个人的窗口句柄,这相当容易。)你想在两个进程中都有某种排除机制(互斥或关键部分),以确保共享值不能同时读取和写入。如果两个流程都可以进行&#34;更改和交换&#34;如果两个人同时尝试这样做,你就会有一个有趣的问题需要解决,因为你必须处理这个共享值死锁的可能性。

您也可以使用共享内存,但需要更多参与。

如果进程位于不同的计算机上,则需要通过TCP / IP或TCP / IP之上的协议来完成。你可以使用pub-sub安排 - 或任何数量的东西。如果不了解您正在尝试完成的内容,就很难知道要推荐什么。

(为了记录,在多进程/多线程操作系统中几乎没有办法在同一时刻共享某些东西&#34;&#34;你可以随意关闭,但计算机不能和#39; t就是那样工作。)

考虑到所涉及的难度,是否还有其他一些设计可能会让这个更清洁?为什么这些流程必须以这种方式交换信息?必须使用单独的流程吗?