Вот ситуация. Есть главное окно, у него есть два дочерних окна, одно из которых обрабатывается в другом thread-е. Дочерние окна перекрывают друг друга (что-то вроде реализации табов) и, при переключении, одно окно (с того же потока, что и главное) перерисовывается нормально, а второе (из другого потока) не всегда перерисовывается.
Переключаются они так:
Здравствуйте, alvv, Вы писали:
A>Привет!
A>Вот ситуация. Есть главное окно, у него есть два дочерних окна, одно из которых обрабатывается в другом thread-е. Дочерние окна перекрывают друг друга (что-то вроде реализации табов) и, при переключении, одно окно (с того же потока, что и главное) перерисовывается нормально, а второе (из другого потока) не всегда перерисовывается. A>Переключаются они так:
A>
A> EnableWindow(off, FALSE);
A> ShowWindow(off, SW_HIDE);
A> ShowWindow(on, SW_SHOW);
A> EnableWindow(on, TRUE);
A>
A>Хочу, чтобы оба окна перерисовывались. Что я делаю не так?
Что значит "обрабатывается"? Создаются в разных потоках? Если да — то не надо так делать — создавать надо все окна в одном и том же потоке.
Здравствуйте, BlackHeretic, Вы писали:
BH>Что значит "обрабатывается"? Создаются в разных потоках? Если да — то не надо так делать — создавать надо все окна в одном и том же потоке.
Тоесть, нет возможность заставить эту конструкцию нормально работать (мне нужно создавать окно в другом потоке)?
Здравствуйте, alvv, Вы писали:
A>Здравствуйте, BlackHeretic, Вы писали:
BH>>Что значит "обрабатывается"? Создаются в разных потоках? Если да — то не надо так делать — создавать надо все окна в одном и том же потоке.
A>Тоесть, нет возможность заставить эту конструкцию нормально работать (мне нужно создавать окно в другом потоке)?
Видите ли что происходит. Когда переключаетесь на таб из другого потока, по идее его нужно перерисовать, но управление сейчас у основного потока. То есть пока тот поток не получит свой квант времени — окошко не сможет перерисоваться. Еще я подозреваю, что во втором потоке генерится еще один WM_PAINT и скорее всего новый WM_PAINT выбрасывает из очереди старый (точно не знаю, но очень похоже на истину, да и логично).
Скажите в чем такая острая необходимость создавать окно именно в отдельном потоке?
Здравствуйте, alvv, Вы писали:
A>Привет!
A>Вот ситуация. Есть главное окно, у него есть два дочерних окна, одно из которых обрабатывается в другом thread-е. Дочерние окна перекрывают друг друга (что-то вроде реализации табов) и, при переключении, одно окно (с того же потока, что и главное) перерисовывается нормально, а второе (из другого потока) не всегда перерисовывается. A>Переключаются они так:
A>
A> EnableWindow(off, FALSE);
A> ShowWindow(off, SW_HIDE);
A> ShowWindow(on, SW_SHOW);
A> EnableWindow(on, TRUE);
A>
A>Хочу, чтобы оба окна перерисовывались. Что я делаю не так?
Тут все просто, поток, который владеет не перерисованным окном, сейчас чем то занят. Он не может именно в это время обработать WM_PAINT.
Каким то образом тебе нужно в другом потоке обрабатывать очередь другого потока. Насколько мне известно Windows не позволяет это сделать (исключение AttachThreadInput — но тут оно ничем не поможет)
Так что советую смирится...
Здравствуйте, BlackHeretic, Вы писали: BH>Скажите в чем такая острая необходимость создавать окно именно в отдельном потоке?
Образно: мне нужно было сделать так, чтобы второе окно (какой-бы код там не работал) не влиял на работу основного потока программы. Когда нужно, я бы прятал бы окно и создавал новое...