Форум: "Система";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
ВнизMessages & TThread Найти похожие ветки
← →
Digitman (2002-07-30 13:37) [40]>>Synchronize(SetSQLReady);
Зачем Synchronize ? С каким неразделяемым ресурсом ты работаешь в SetSQLReady() ? Не вижу ничего, кроме PostMessage()
Ну, это так , к слову ...
Вообще же - ну не вижу я никаких явных плюх ... Если дело до Dispatch() действительно доходит и в момент вызова код сообщения действительно равер константе PM_THREADCMD или PM_ENDTHREAD, то все должно работать !
Хорошо, пробуй на время вот такой (полноэквивалентный) заменитель Dispatch() :
While (Not Terminated) and GetMessage(lpmsg,0,0,0) Do
case lpmsg.Message of
PM_THREADCMD: PMThreadCmd(lpmsg.Message);
PM_ENDTHREAD: Terminate;
← →
Lmatveev (2002-07-30 13:49) [41]Прошу прощения, если мой совет не в кассу, но я бы на вашем месте воспользовался пакетом GALA Library ( http://gurin.tomsknet.ru/gala.html). Там все, что касается работы с потоками уже реализовано, и вместо того, чтобы отлаживать системные функции, можно заняться программированием непосредственно функционала приложения
← →
Dynamit (2002-07-30 13:50) [42]Вот на эту строку
PM_THREADCMD: PMThreadCmd(lpmsg.Message);
Компилятор дает такую ошибку:
[Error] UQThread.pas(114): Types of actual and formal var parameters must be identical
Т.е. получается, что lpmsg.Message имеет разный тип с TMessage?
А насчет
> Synchronize(SetSQLReady);
я думал убрать, да руки не доходят... как нибудь... или сейчас!
Спасибо за напоминание!
← →
Digitman (2002-07-30 14:02) [43]Мда .....
PM_THREADCMD: PMThreadCmd( @lpmsg.Message);
Мне каждую очепятку свою исправлять ? Или таки доведешь до ума своими силами ? Взялся за API, а в типах - плаваешь ...
← →
Dynamit (2002-07-30 14:13) [44]
> PM_THREADCMD: PMThreadCmd(@lpmsg.Message);
Да я бы довел, но ведь и на эту строку та же ошибка!
Да и потом не понимаю я как это
message: UINT
будет одного типа с TMessage, а тем более адрес...
ну трудно мне это понять - вот и спрашиваю не боясь сойти за тупого !
← →
Digitman (2002-07-30 14:26) [45]Вот проблема-то !(
Ну так тогда :
var
pMsg: PMessage;
...
While (Not Terminated) and GetMessage(lpmsg,0,0,0) Do
begin
pMsg := @lpmsg.Message
case lpmsg.Message of
PM_THREADCMD: PMThreadCmd(pMsg^);
PM_ENDTHREAD: Terminate;
end;
end;
PM_THREADCMD: PMThreadCmd(pMsg^);
>>не понимаю я как это
Ну ты сравни две структуры : TMsg и TMessage ! Они очень похожи !
а Dispatch() требует в кач-ве параметра просто адрес . Некий адрес, по которому находится некий UINT. Тот же некий адрес может быть интарпретирован тобой и как адрес структуры TMessage, ппо смещению +0 которой лежит тот же самый UINT
← →
Dynamit (2002-07-30 14:42) [46]Все отработало на ОК!!
Так может быть сделать нечто похожее с Dispatch()???
← →
Digitman (2002-07-30 15:05) [47]Dispatch() должен работать ! Просто обязан ! Иначе вся VCL и ее производные - коту, извините, под хвост ...
Эх, заглянуть бы в окно CPU у тебя при брейкпойнте на Dispatch() ! Все бы встало на свои места и "глюк" твой сразу бы вычислили в 2 счета .. А так - упаришься вычислять лажу ... Весь проект целиком нужно видеть ... и модуль с TQueryThread - в первую очередь ... чего-то ты недоговариваешь ..
Кстати, а не переопределил ли ты иным образом константу PM_THREADCMD в модуле, где декларирован класс TQueryThread ?
Ну , если ты настолько ленив, чтобы не копать до истины, бросай Dispatch() и делай case...of
← →
Dynamit (2002-07-30 15:54) [48]У меня все константы определяются в DataModule и более нигде!
Насчет сокрытия чего-либо - это не ко мне - мне скрывать нечего.
Я же говорил, что модуль привел полностью, только процедуры создания временных таблиц и копирования из одной таблицы в другую не стал приводить, да и не этот модуль самый большой в программе ;)
Вот только трудновато сейчас с AS/400 - жара, виснут паразитки.
А окно CPU можнопопробовать. Его когда дергать - прямо в момент брекпойнта на Dispatch()?
← →
Digitman (2002-07-30 16:21) [49]Ну да) ... в момент брейкпойнта - когда ж еще ? Нужно ж выяснить, что реально происходит ... открывай system.pas на реализации TObject.Dispatch() - там всего-то дюжина строчек - шагай инструкция за инструкцией и контролируй, что ожидается и что есть на самом деле ... только так истина выясняется в таких смутных моментах !
← →
Dynamit (2002-07-31 09:37) [50]Эх, далеко мы забрались, а проблема оказалась сверху!!
Шел я вчера с работы и думал, ну и понял вдруг, что QueryForm у меня тоже является объектом, а значит имеет метод TObject.Dispatch() !!! Так что пришел сегодня на работу, поставил
self.Dispatch() и все заработало как надо!!!!
Интересно, додумался бы я, если бы вчера не просматривал выполнение процедур в ассемблерном виде в дебаггере? Да еще реализацию Application.Run...
Ну вот вроде бы и все! Спасибо за помощь и науку - мне все, что здесь было сказано сильно пригодится!
Dynamit
← →
Digitman (2002-07-31 09:52) [51]Упс !
А ведь ты прав !!!!
Я ведь тоже - вот тундра то !) - не обратил внимания на with QueryForm )))))
Ну молодец ! Что ж сказать еще ) ...
Страницы: 1 2 вся ветка
Форум: "Система";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.012 c