Диалоговое окно для прерывания цикла while в C ++ / CLI - PullRequest
0 голосов
/ 31 октября 2011

У меня есть цикл while, выполняемый в функции.Пока цикл выполняется, я хотел бы иметь диалоговое окно с кнопкой «Прервать» для отображения на экране в Windows.Если я нажму кнопку «Прервать», программа завершит цикл while.Это похоже на диалог, который появляется при копировании файла.Кто-нибудь может предложить простой способ сделать это с C ++ / CLI или что-то подобное?

Поскольку у меня нет большого опыта работы с C ++ / CLI, я был бы признателен, если бы вы могли предоставить мне фрагменты кода илиобразцы кодов.

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Использование отдельного потока - это современный способ сделать это, но есть и другой подход.

Вы можете взять все из цикла while и поместить их в обработчик событий.Сделайте так, чтобы цикл обработки сообщений вызывал этот обработчик событий снова и снова, пока работа не будет выполнена (например, с использованием таймера или обработки в режиме ожидания).В то же время вы можете отобразить немодальное всплывающее диалоговое окно.Так работала печать в эпоху упреждающей многозадачности.См. SetAbortProc .

Я бы порекомендовал подход второго потока, указанный другими.Я просто хотел отметить, что это не единственный способ.

0 голосов
/ 31 октября 2011

Один простой (но плохой) пример может быть таким:

#include "stdafx.h"
#include "windows.h"

#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::Windows::Forms;
using namespace System::Threading;

DialogResult *res=new DialogResult(DialogResult::No);

void waitForUserAction()
{
    while(*res==DialogResult::No)
    {
    *res=System::Windows::Forms::MessageBox::Show("Exit the loop ? YES/NO","TEST",
                MessageBoxButtons::YesNo,MessageBoxIcon::Question);
    if(*res==DialogResult::Yes)
        Console::WriteLine(L"Exit by user");
    }
}

int main()
{

    ThreadStart ^start=gcnew ThreadStart(waitForUserAction);
    Thread ^pThread=gcnew Thread(start);
    int a=0;

    pThread->Start();
    while(*res!=DialogResult::Yes)
    {
        a=a+1;
        Console::WriteLine(L"Loop processing here...{0}",a);
    }
    //pThread->Abort();
    return 0;
}

Вы можете проверить эту статью для получения дополнительной информации по теме ...

0 голосов
/ 31 октября 2011

Конструкция петли while является легкой частью. Что делает это трудным, так это то, что вам придется поместить диалоговое окно прерывания в другой поток, а затем согласовать флаг в условии while с диалоговым окном. Это обычно обрабатывается семафорами, которые, как известно, трудно кодировать без незначительных побочных эффектов.

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

//psuedo-code below
bool f_abort = false;
while (!f_abort)
{
    do_partial_work();
    f_abort = checkForAbort();
    sleep(0); // don't want to lock the CPU
}

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

Потоки и события Windows Forms - ListBox обновляется быстро, но прогрессбар испытывает огромную задержку

Синхронизация Win32

Оптимально ли удерживать нить?

Тема для формы Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...