2014-10-07 2 views
0

У меня есть приложение wxwindows и в OnClick случае кнопки, у меня есть очень длительный процесс, например, у меня есть что-то такое, как это:Как предотвратить длительный процесс висит окно WxWidgets

for(int i=1;i<100;i++) 
{ 
    sleep(1000); 
    gaugeProgress->SetValue(i); 
     *textOutput<<i; 
} 

Выполняя этот код, пользовательский интерфейс не реагирует. Добавить

Refresh(); 
Update(); 

только после того, как

*textOutput<<i; 

, но это не сработало.

Есть ли способ, которым я могу помнить события?

Я работаю на Windows, используя VS 20102

+2

Создать новую тему и выполнить трудоемкую работу в этой теме. Вы можете отправлять уведомления из этого потока в основной поток пользовательского интерфейса, если вам нужно сигнализировать о ходе или завершении. Аналогично, вы можете отправлять сообщения из основного потока в новый поток, если хотите отменить задачу. Там много поводов, я представляю, что кто-то покрыл wxWidgets и как решить эту задачу при использовании этой структуры. :) – enhzflep

+0

@enhzflep Спасибо. Как общаться между потоками? Есть ли помощь от Boost? Я помню, что в MFC существовал метод, который обрабатывал событие, и он останавливается от зависания. Есть ли такие методы в WxWidgets? – mans

+0

Нет проблем. В обычном мире win32 можно использовать 'SendMessage' или' PostThreadMessage'. Я не использую BOOST и не нуждаюсь в потоках ни в одном из моих тривиальных проектов wx. Я предполагаю, что поиск «эквивалентов WxWidgets для PostThreadMessage» может привести к полезным результатам. Это один из результатов, возможно, полезно: https://forums.wxwidgets.org/viewtopic.php?t=8392 – enhzflep

ответ

0

Вы можете добавить элемент wxTimer в ваших wxwindows, запустить его в окне конструктора, как таковой:

m_timer.Start(1000); 

затем захватить событие таймер с , например:

void mywindow::OnTimer(wxTimerEvent& event) 
{ 
    Refresh(); 
    Update(); 
} 

Убедитесь, что вы подключили событие к члену wxTimer.

0

В этих случаях я использую wxYield(), как это:

for(int i = 1; i < 100; i++) 
{ 
    // sleep() freezes the program making it unresponsible. 
    // sleep(1000); 
    gaugeProgress->SetValue(i); 
    *textOutput << i; 
    // wxYield stops this function execution 
    // to process all the rest of stocked events 
    // including the paint event and resumes immediately. 
    wxYield(); 
} 

Это останавливает текущий процесс и позволяет приложению обрабатывать стек сообщений, как в случае краски.

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

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