Thread и синхронизация с GUI

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Thread и синхронизация с GUI

Post by borr_1 » Wed Oct 21, 2009 1:11 pm

Подскажите лучший путь для следующей ситуации
В приложении есть несколько контролов... скажем Grid в них из нескольких разных потоков идет загрузка 1 Grid - 1 Thread
Как тут лучше синхронизировать. Ссылки читал, пример смотрел.Интересно ваше мнение.
Я сейчас работаю через эвенты... это неудобно потому-чтто каждый раз нужно завадить новый эвент.
Хочется узнать о wxMutexGuiEnter() она как-то ненаглядна.
Если wxMutex, то прошу описать схемку работы с ним... Что с ним делать в самом приложении перед тем как записать данные в Grid после того. И что с ним делать в потоке перед тем как записать данные в потоке и после того?
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Wed Oct 21, 2009 2:13 pm

Привет,
насчет ненаглядности не понял, по-моему очень прозрачно:
http://docs.wxwidgets.org/stable/wx_thr ... exguienter

Но, вообще-то, я бы через евенты и работал, так надежнее. Насчет этой wxMutexGuiEnter/Leave() ничего хорошего не пишут (хотя сам не пробовал, пользуюсь в таких случаях евентами).
Ну и насчет заведения новых евентов не совсем понял, зачем каждый раз новые заводить?
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Wed Oct 21, 2009 2:21 pm

Ну и насчет заведения новых евентов не совсем понял, зачем каждый раз новые заводить?
Тут я не совсем верно выразился. Сама схема работы мутарная - нужно завести общую переменную/структуру данных (или передать их в поток) в потоке обработать послать по окончании event GUI чтобы та дотянула данные из структуры.
А если таких гридов на форме 4-ре и у каждого свой поток как тут разруливать?
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya » Wed Oct 21, 2009 3:07 pm

Можно писать в общий пул и защищать его мютексами. А главный GUI поток информировать через Pending Event о наличии новых данных в пуле.

Или можно передавать саму структуру в pending event-е, ничего не блокируя.
borr_1 wrote:А если таких гридов на форме 4-ре и у каждого свой поток как тут разруливать?
Передавать ID или указатель грида в event-e, а в обработчике события анализировать это. В этом случае скорее всего понадобится свой (один) класс события.

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Oct 22, 2009 4:16 am

Kolya wrote:Можно писать в общий пул и защищать его мютексами. А главный GUI поток информировать через Pending Event о наличии новых данных в пуле.
Можешь поподробнее показать? Что делать с Mutex'ами в потоке и в приложении
Kolya wrote: Или можно передавать саму структуру в pending event-е, ничего не блокируя.
borr_1 wrote:А если таких гридов на форме 4-ре и у каждого свой поток как тут разруливать?
Передавать ID или указатель грида в event-e, а в обработчике события анализировать это. В этом случае скорее всего понадобится свой (один) класс события.
Я вообще не понимаю как с event'ом можно передать структуру? И что за pending event я делаю

Code: Select all

void _MyThread::OnExit()
{
   m_frame->thrStart = false;
   wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, END_WORK );
   wxPostEvent(m_frame, event);
}
И вообще как приостановить поток пока я забиваю данные из структуры в Grid и надо ли это делать (можно ли параелльно с чтением записывать данные в структуру)
Структура такая

Code: Select all

struct rows{
  int id;
  wxString Pole1;
  wxString Pole2;
  double sum;
};
std::vector<rows> table;
[/quote]
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya » Thu Oct 22, 2009 11:35 am

borr_1 wrote:Можешь поподробнее показать? Что делать с Mutex'ами в потоке и в приложении
Блокировать мютекс в приложении и в потоке при помощи wxMutexLocker как показано сдесь:
http://docs.wxwidgets.org/trunk/classwx_mutex.html
borr_1 wrote:Я вообще не понимаю как с event'ом можно передать структуру? И что за pending event я делаю
Необходимо создать свой класс события как описано здесь на примере MyPlotEvent:
http://docs.wxwidgets.org/trunk/overvie ... nts_custom

И это будет выглядеть как:

Code: Select all

class MyPlotEvent: public wxEvent
{
public:
    MyPlotEvent(.. grid, .. table) ..
    {
    }
    void Exec()
    {
         m_grid->Add .. m_table
    }
  
    // implement the base class pure virtual
    virtual wxEvent *Clone() const { return new MyPlotEvent(*this); }

private:
    std::vector<rows> m_table;
    wxGrid *m_grid;
};

void _MyThread::OnExit()
{
   m_frame->thrStart = false;
   MyPlotEvent event( grid, table );
   wxPostEvent(m_frame, event);
}

void Frame::OnPlotEvent(wxPlotEvent &event)
{
    event.Exec();
}

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Oct 22, 2009 1:29 pm

Необходимо создать свой класс события
Об этом я как-то не подумал.
Резюме одно пробовать, пробовать и еще раз пробовать.

Спасибо всем откликнувшимся.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

Post Reply