2013-06-02 4 views
0

Я ищу концепцию о том, как реализовать следующее: У меня есть 4 устройства, подключенные через RS232 к ПК, где я хочу создать какое-то управляющее приложение. Я уже создал классы для 4 различных устройств, которые обрабатывают обработку сообщений и ошибок.C# Использование потоков для ожидания нескольких условий

В основном потоке теперь я хочу создать последовательность инициализации. Например, один параметр управления - это температура. Поэтому я устанавливаю температуру и затем должен ждать до 10 минут, пока температура не будет достигнута. Когда это достигнуто, я хочу установить выходное напряжение источника питания и так далее. Есть параметры, которые мне нужно контролировать параллельно (пока вы ожидаете, что температура попадет в приемлемое окно, мне также необходимо следить за тем, чтобы давление находилось в каком-то диапазоне).

Так что я мечтаю о чем-то вроде этого, но не имеют ни малейшего понятия о HOWTO лучше понять это:

Device1.setTemp (200); magic.Wait (функция для получения текущего значения, объект, содержащий минимальные/максимальные уровни, максимальное время);

Для простого случая. Но я думаю, как только я знаю, в каком направлении идти, я могу расширить его, чтобы можно было контролировать несколько значений.

Пожалуйста, приведите меня в хорошем направлении. Я уже смотрел в темы, BackgroudWorkers и так далее. Существует много различных вариантов, но я не знаю, как создать его безопасным способом с самого начала.

Спасибо, thefloe

ответ

1

Вы можете использовать EventWaitHandles для синхронизации операций в пределах ваших потоков. Подробнее here.

static EventWaitHandle _go = new AutoResetEvent(false); 

static void Main(string[] args) 
{ 
    //Set the temperature 
    int Temp = 100; 
    int Voltage = 240; 

    Thread t1 = new Thread(() => SetTemperature(Temp)); 
    Thread t2 = new Thread(() => SetPowerVoltage(Votage)); 
    Thread t3 = new Thread(() => SomeOtherImportantWork()); //Which can go on in parallel 
    t1.Start(); 
    t2.Start(); 
    t3.Start(); 
    .... 
    .... 

    //you can wait or do other operations 
} 

//Logic to set the temperature 
static void SetTemperature(int temperature) 
{ 
    Console.WriteLine("Setting temperature"); 

    //Do your stuff  

    //Signal your other thread 
    _go.Set(); 

} 


static void SetPowerVoltage(int voltage)   
{ 
    //Wait for the temperature to be set 
    Console.WriteLine ("Waiting..."); 
    _go.WaitOne(); 


    //This will begin execution once the temp thread signals 
    //Do your stuff to set voltage 

} 

static void SomeOtherImportantWork()   
{ 
    //Do Important work 
} 
+0

спасибо. Я был уверен, что есть простой способ сделать это. Это именно то, что я искал;) – thefloe

Смежные вопросы