Запустите функцию "В фоновом режиме" WinForm (VS2010 C ++) - PullRequest
5 голосов
/ 31 июля 2011

У меня есть функция, которая работает в течение нескольких часов .. Я хочу, чтобы при нажатии на кнопку эта функция запускалась, а при нажатии на кнопку анотера (Стоп) эта функция была бы остановлена ​​(обрыв) - но проблема в том, что форма «зависла» во время работы функции - и нет возможности нажать на кнопку Стоп . Так как же заставить функцию работать без залипания формы?

Второй вопрос: как мне сделать кнопку Стоп - как мне сломать функцию во время ее выполнения (вне функции ...)

Моя причина в том, чтобы создать новую форму, которая будет запускать только функцию ... и основная форма сможет закрыть эту форму во время выполнения - есть ли лучшее решение?

спасибо!

Ответы [ 3 ]

2 голосов
/ 31 июля 2011

Если вы можете использовать .NET 4, посмотрите на библиотеку параллельных задач. На сегодняшний день это самый простой способ обработки потоков для приложения .NET (включая WinForms).

http://msdn.microsoft.com/en-us/library/dd460717.aspx

Использование с C ++:

http://msdn.microsoft.com/en-us/library/gg675934.aspx

Ваш фоновый код может просто выполняться в задаче, а кнопки «Пуск / Стоп» могут установить флаг, указывающий задаче, должна ли она обрабатывать работу.

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

2 голосов
/ 31 июля 2011

В вашем основном потоке создайте рабочий поток для вашей вычислительной задачи, которая будет выполняться часами.Win32 API CreateThread должен помочь в этом. См. Справку по функции здесь и пример здесь .

Затем вам нужно связаться с вашим рабочим потоком, в частности, сообщить ему об остановке, когда вы нажмете кнопку Стопнажата.Несколько способов, PostThreadMessage должен быть одним из самых удобных для этого. См. Справку по функции здесь .

Таким образом, при нажатии кнопки «Стоп» сообщение будет отправлено в ваш рабочий поток, и ваш рабочий поток периодически проверяет, присутствует ли такой сигнал «Стоп».испускается вашим основным потоком.Вы можете решить, как «периодически» он проверяет, что, в свою очередь, решает, насколько реагирует ваш рабочий поток, когда сигнализируется «Стоп».

2 голосов
/ 31 июля 2011

Прочитайте немного о понятии потоков.WinAPI предоставляет обе функции для запуска нового потока и управления им, поиска в MSDN для них - создание новой формы не подходит.

...