Автор
|
Тема: Опять я со своими таймерами... ;-)
|
Kosha |
опубликован 10-04-2001 20:00 MSK
Как тут (недавно) посоветовал глубокоуважаемый модератор, переделал все на multimedia-timer'ы. Но тут же возникла проблема еще страннее чем в тот раз ;-)) Я делаю таймер в CDocument. функция, где он делается, вызывается из CView. причем делаю timeSetEvent(wTimerDelay,wTimerRes,TimerCallback,(ULONG)this,TIME_PERIODIC);но в TimerCallback и всем, что вызывается из него, почему-то в списке CView'ов класса CDocument "обрубаются" все CView. Выглядит это как в ASSERT_VALID документа GetNextView возвращает СОВСЕМ кривой поинтер. В это же время, все мемберы CDocument вызываются и обрабатываются очень даже нормально ;-) Кто поможет бедному прогламеру? ;-)
|
aldep
|
опубликован 10-04-2001 22:17 MSK
Точно не знаю, но есть идея, что связано с тем, что все вызовы callback'ов в timeXXX функциях идут в отдельной специально созданной нити. Может поэтому? |
Kosha
|
опубликован 11-04-2001 12:15 MSK
но тогда почему все кроме View'ов нормально? Проверил, поток один ;-(((( BTW, я так и не понял: зачем используется timeBeginPeriod и когда вызывать timeEndPeriod??? |
Kosha
|
опубликован 11-04-2001 12:53 MSK
Тьфу ты. Потока-то два, а как это влияет на поинтеры объектов? |
OlegN
|
опубликован 11-04-2001 12:31 MSK
А как ты объявил функцию TimerCallback ? Как член твоего класса CDocument ? Это делать нельзя ! Я бы написал так : void CALLBACK MyTimeProc( UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 ) { CMyDocument* pThis = (CMyDocument*)dwUser; }
|
OlegN
|
опубликован 11-04-2001 12:48 MSK
За примером сходи на http://support.microsoft.com/support/kb/articles/q153/4/00.asp |
Kosha
|
опубликован 11-04-2001 15:22 MSK
Именно так и объявляю. Пробовал также в CDocument как static, и все равно такой баг.А насчет экзампла - там через, извиняюсь, большую задницу, и неохота лишние DLLки подрубать ;-((((((( |
aldep
|
опубликован 11-04-2001 21:17 MSK
2 Kosha А ты попробуй пошагово зайти в AssertValid функцию. Исходники MFC то есть. И тогда разберешься что ей не нравится. Если что интересное накопаешь - поделись с народом.P.S. Мне все же кажется что там все с нитями связанно.
|
Kosha
|
опубликован 11-04-2001 21:22 MSK
Да написал же: Вхожу в CDocument::Assert_valid, там есть такой кодик: void CDocument::AssertValid() const { CObject::AssertValid(); POSITION pos = GetFirstViewPosition(); while (pos != NULL) { CView* pView = GetNextView(pos); ASSERT_VALID(pView); } } так вот, CObject::AssertValid() прокатывает, а pView, вернутый GetNextView'ом, уже нет. Сам поинтер вместо нормального HWnd содержит какой-то DWORDовый мусор. Причем pos, вернутый GetFirstViewPosition, тоже кривой... |