Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.019 c
1-31825
Igel
2002-09-27 14:18
2002.10.10
Автоматизация загрузки


14-31949
NetBreaker666
2002-09-14 14:38
2002.10.10
Есть ли здесь кто-нибудь с МтМеха СПбГУ ??? Да, и фидошники ?


1-31886
vixic
2002-09-30 10:12
2002.10.10
командная строка


1-31728
Ruslan_i
2002-09-30 14:58
2002.10.10
минимизация приложений с модальными окнами


3-31657
BlackTiger
2002-09-20 11:34
2002.10.10
КАК: