Ваш форум мне однажды уже помог с Qt, сейчас вот снова возникла потребность в помощи.
Подозреваю тема не нова, но что-то сходу не нашёл ответа. Начну немного издалека, чтобы вопрос был более понятный. Просто боюсь что либо я не по канонам случайно использую слова, котоыре зарезервированы в языке, в ООП, и просто в сленге под совершенно конкретные понятия, и может вовсе не те которые я бы хотел. )
Предположим у нас на плате есть 2 микроконтроллера. Каждый их них имеет у себя вечный цикл в котором чёт делается. Время от времени, в цикле, микроконтроллеры могут впадать в спячку для снижения энергопотребления. В спячке он спит мертвым сном, ничего не опрашивая, ничего не делая, просто спит. Из спячки микроконтроллер может вывести дергание за ногу(кто-то из вне подаёт ноль или единичку на ногу). Микроконтроллер после этого просыпается и дальше чёт там делает. В нашем случае один из микроконтроллеров будет будить второго. Тоесть от второго к первому будет приходить СОБЫТИЕ для пробужения. Вот это я называю СПАТЬ ПОКА НЕ ПРИЙДЕТ КАКОЕТО "СОБЫТИЕ". (Слово событие EVENT как блин только не используют(что удивительно вполне себе законно), и иногда возникает путаница(по крайней мере у меня), я поэтому и привёл пример с микроконтроллерами). Дальше вопрос микроконтроллеров касаться уже не будет. Будет просто упоминание слова СОБЫТИЕ. Вот имено точно в таком же смысле как я сейчас описал.
Суть вопроса:
Пусть у нас на компе запущено два екзешника (2 разных процесса), более того они ещё и на разных языках написаны. При этом, они должны уметь друг другу слать СОБЫТИЯ (без данных! просто: либо есть событие либо его нет). Во время работы процессы, могут засыпать в ожидании события, чтобы пока делать нечего не грузить систему. Можно БЫЛО БЫ конечно заставить их по таймеру или в цилке опрашивать какуюто переменную в SharedMemory котору бы мог изменять второй проесс, но смысла нет грузить проц и ОС такой бредовой работой. Я написал пример как это реализовать для двух процессов на С++ и C#. Код ниже. Это две аналогичные по сути программы. Не мог ли бы вы, мне помочь с таким же ТРЕТЬИМ простым примером на Qt?
С++ вариант:
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE MyEventWaitHandleSend;
HANDLE MyEventWaitHandleReceive;
MyEventWaitHandleReceive=CreateEventEx(NULL, L"myEWH1", 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
MyEventWaitHandleSend=CreateEventEx(NULL, L"myEWH2", 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
printf("Waiting event from other program....\n");
WaitForSingleObject(MyEventWaitHandleReceive, 0xFFFFFFFF);//INFINITE
printf("Received\n");
SetEvent(MyEventWaitHandleSend);
printf("Sent\n");
CloseHandle(MyEventWaitHandleReceive);
CloseHandle(MyEventWaitHandleSend);
scanf("press Enter");
return 0;
}
C# вариант:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WinForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
EventWaitHandle MyEventWaitHandleReceive;
EventWaitHandle MyEventWaitHandleSend;
MyEventWaitHandleReceive = new EventWaitHandle(false, EventResetMode.AutoReset, "myEWH2");
MyEventWaitHandleSend = new EventWaitHandle(false, EventResetMode.AutoReset, "myEWH1");
MyEventWaitHandleSend.Set();
MyEventWaitHandleReceive.WaitOne();//waiting answer
this.label1.Text = "Ok";
MyEventWaitHandleReceive.Dispose();
MyEventWaitHandleSend.Dispose();
}
}
}
Спасибо за внимание.
P.s.... Слышал вроде что как-то можно через QWinEventNotifier сделать, но может и иначе как-то можно...