C ++ MultiThreading с приложением Visual Studio Express 2010 Forms - PullRequest
5 голосов
/ 15 апреля 2011

Я занимаюсь разработкой приложения для форм Windows, которое подключается к аппаратному обеспечению, получает много данных (~ 1 GSample / sec), обрабатывает их и выдает их на экран при нажатии кнопки.Сейчас я пытаюсь автоматизировать процесс в цикле, который может быть запущен / остановлен в любое время, чтобы я мог отслеживать его, настраивая входные данные для оборудования сбора данных.Я думаю, это ясно, что мне нужно сделать это в отдельном потоке, но у меня есть куча времени, пытаясь сделать это в C ++ / Cli - я нашел несколько хороших примеров с использованием MFC, который не поддерживаетсяExpress.

В частности: моя задача - нажать кнопку, которая обрабатывается в Form1.h, чтобы вызвать функцию в моем главном файле Acquisition.cpp, который содержит следующий код (в настоящее время это бесконечный цикл)

void Form1::realTimeUpdate()  
{  
    // live is a boolean variable set by a button on the form
    while(live)  
    {  
        displayVariance(getVar(getQuadratures(100),nbrSamples));  
    }  
}  

Я хочу выполнить этот код в отдельном потоке, чтобы основная программа могла прослушивать запрос пользователя на остановку операции.Без многопоточности мне в настоящее время приходится принудительно выходить из программы (или запускать ее фиксированное количество раз), чтобы остановить ее.

Есть ли какие-либо предложения о том, как можно выполнить этот код в отдельном потоке?

Я (безуспешно) уже пробовал несколько вещей:

  1. Изменение примера, приведенного в Этот пример Microsoft .Проблема: требуется параметр / clr: oldSyntax , который несовместим с другими 1300 строками кода в программе.

  2. Попытка сделать то, что я сделал бы в Java(Объявите глобальный поток и запустите / остановите его в любой точке кода. Проблема: компилятор не позволит мне объявить глобальный System :: Threading.Thread

  3. this прекрасный пример. Проблема: Требуется MFC.

Любые предложения будут с благодарностью!

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Вы можете использовать BackgroundWorker или Thread для обработки этого. Однако вам необходимо убедиться, что часть вашей работы, которая обновляет пользовательский интерфейс, перенаправлена ​​обратно в поток пользовательского интерфейса.

Вот учебник по многопоточности в C ++ / CLI .

0 голосов
/ 16 апреля 2011

Для записи, по предложению Рида об использовании BackgroundWorker, я просеял код внизу этой страницы и изменил свой код так, чтобы:

  1. Он создал новый backgroundWorker BGWorker, в котором BGWorker-> DoWork () вызвал мою функцию realTimeUpdate ().

  2. Кнопка в главной форме вызывает либо RunWorkerAsync (), либо CancelAsync () в зависимости ото том, запущен процесс или нет (проверено логическим флагом в моей основной программе).

  3. Функция realTimeUpdate () теперь передается BackgroundWorker - realTimeUpdate(BackgroundWorker^ worker, DoWorkEventArgs ^ e) После каждого вычислениязавершить во внутреннем цикле, он вызывает функцию worker-> ReportProgress (result).В функции BGWorker-> ProgressChanged () отдельная функция upDataUI (int) рисует результат в главной форме.

Еще раз спасибо за помощь.

...