Форум: "KOL";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизКак обрабатывать сообщения в КОЛ проге, если она без формы. Найти похожие ветки
← →
nester © (2004-02-26 02:22) [0]Написал прогу, в которой нет формы, просто тупо последовательность комманд. Использую в проге KOLHTTPPROT - это ICSсовская компонента адаптированая под кол. В ней таймаут работает через посылку сообщений(POSTMESSAGE) иза того что у меня нет формы - сообщения не обрабатываются и естественно таймаут никогда не наступает а прога проста подвисает. Подскажите как сделать чтобы сообщения обрабатывались
← →
mdw © (2004-02-26 10:30) [1]А создай Applet-тоже окно и запусти его. Вот и будет цикл обработки обработки собщений.
← →
SPeller © (2004-02-26 11:29) [2]Можно создать любое невидимое окно только лишь для приёма и обработки сообщений. _NewControl без родителя - и вперёд.
← →
nester © (2004-02-26 13:16) [3]Не, товарищи, ну мы же программисты, ну зачем мне форма если она мне не нужна? а делаю я так уже:
Applet:= NewApplet("f");
Th:= NewThread;
Th.OnExecute:= TOnThreadExecute(MakeMethod(nil, @ThExecute));
Th.Resume;
while true do
begin
Applet.ProcessMessages;
sleep(10);
end;
Не помогает
← →
savva © (2004-02-26 13:30) [4]а Run(Applet) кто делать будет? И к тому же я че то не наблюдаю где же ты все таки обрабатываешь сообщения?
Назначь обработчик сообщений
applet.OnMessage:=TOnMessage(MakeMethod(nil,@ProcessMesages)); // назначаем новый обработчик сообщений
и потом лови их// обработка сообщений
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
case Msg.message of
WM_<что-то твое> : begin
ShowMessage("Неужели работает??!!");
end;
end;
result:=false;
end;
и наслаждайся.
← →
nester © (2004-02-26 13:36) [5]а-а-а-а-а-а, даже так?
Мне нужно чтобы были обработчики по умолчанию которые.
Лично обрабатывать мне не надо, нужно просто чтобы срабатывали основные. Я вот и думал что Applet.ProcessMessages этим и займется в цикле. SAVVA в вашем примере тогда похоже мне нужно сделать
Либо
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
result:=true;
end;
или
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
inherited true;
end;
Какой из этих способов сработает чтобы обработчики по умолчанию вызывались?
Заранее благадарю
← →
savva © (2004-02-26 13:53) [6]Только вся беда в том, что после Run(Applet) начинается обработчик сообщений по умолчанию (то бишь больше ни одной строки из твоего кода, стоящего после Run не будет выполнено до закрытия аплета). Вывод напрашивается сам собой: организовать альтернативную обработку сообщений, дабы стартовать свою работу. Что собственно и было показано в предыдущем примере.
ЗЫ. По поводу твоегоresult:=true;
см. http://kol.mastak.ru/FAQ.htm#1
← →
nester © (2004-02-26 14:01) [7]Сорри, я наверно не привел весь код, поэтому не понятно.
Applet:= NewApplet("f");
Th:= NewThread;
Th.OnExecute:= TOnThreadExecute(MakeMethod(nil, @ThExecute));
Th.Resume;
Run(applet);
Собсна мой треад в начале запустился и работает, а потом я только запускаю аплет, так вот не работает.
Щас попробую applet.OnMessage присвоит с result:= false;
Но блин мне казалось, что если OnMessage не перекрывать - то обработчики сами собой вызовуться по умолчанию
← →
nester © (2004-02-26 14:03) [8]Да, в треде я создаю экземплаяр PHTTPProt.
Так вот он там когда наступает таймаут - посылает сам себе сообщение и выходит из цикла, так вот сообщение до него не доходит в таком варианте, если делать все нормально с формой, то работает, но блин, нафиг мне форма то?
← →
savva © (2004-02-26 14:07) [9]ты бы весь код сюда привел - было б понятнее
> нафиг мне форма то?
Для обработки сообщений:) Отнесись к этому философски (тем более что особой разницы в быстродействии/размере приложения заметно не будет)
← →
nester © (2004-02-26 14:16) [10]Допривожу код остального к [7]
function ThExecute(Dummy:Pointer; Sender: PThread): Integer;
begin
s:= CheckForUpdate;
end;
function CheckForUpdate:string;
var
s, body: string;
begin
try
body:= GetUrl(servername + updatefilename);
s:= trim(body);
if length(s) > 0 then
if (s[1] <> "#") and (pos("=", s)>0) then
result:= s;
finally
end;
end;
function Stream2String(Stream : PStream): string;
var
s: string;
begin
setlength(result, Stream.Size);
Stream.Position:= 0;
Stream.Read(result[1], Stream.Size);
end;
function GetUrl(url: string): string;
var
stream: PStream;
begin
//get txt or HTML file and return string
Stream := NewMemoryStream;
GetHTTP(url, Stream);
result:= Stream2String(Stream);
Stream.Free;//Destroy;
end;
function GetHTTP(url: string; var Stream: PStream; const ContentRangeBegin: integer = 0): boolean;
var
HttpCli1:PHttpCli;
begin
HttpCli1:=NewHttpCli(nil);
if ContentRangeBegin > 1000 then
begin
HttpCli1.ContentRangeBegin:= Int2Str(ContentRangeBegin - 1000);
Stream.Position:= ContentRangeBegin - 1000;
end;
try
HttpCli1.Agent:= "Mozilla/3.0 (compatible)";
HttpCli1.Accept:= "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
HTTPCli1.URL:= url;
HttpCli1.RcvdStream:= Stream;
HttpCli1.Get; //Вот тут и зависает зараза
result:= true;
except
end;
HttpCli1.Free;
end;
Вот собсвенно и код, там где комментарий что зависает - это вызов метода этого айсиэса, посмотрел его исходники описание см [8]
← →
savva © (2004-02-26 14:19) [11]первое что я могу посоветовать на вскидку (так как у меня нету ICS) - сделай HttpCli1:=NewHttpCli(Applet);
← →
nester © (2004-02-26 14:29) [12]Не, не помогло, ладно забил я на это, сделал невидимую форму для обработки, и екзешник стал на 7 кил тяжелее, ХРеново.
← →
savva © (2004-02-26 14:30) [13]еще один совет - сделай форму без использования апплета. не знаю как поможет, но все таки попробовать стоит
← →
SPeller © (2004-02-26 16:31) [14]Ты вы народ, чё извращаетесь?
Создаете тред, в нём примерно следующее:
MyCtl := _NewControl( .. );
MyCtl.OnMessage := MyMessageHandler;
while not AppletTerminated do
begin
WaitMessage;
MyCtl.ProcessMessages;
end;
В обработчике MyMessageHandler обрабатываете нужные сообщения, а все остальные просто игнорируете. И нахрена вам аплет с формой сдались?? )
← →
savva © (2004-02-26 16:36) [15]у него засада другого плана (ему не нужено его собственный обработчик сообщений, как я понял): в компоненте ожидание таймаута реализовано через сообщение. Когда нету окошка - сам компонент не может свое сообщение обработать. Возможно я ошибаюсь..
← →
SPeller © (2004-02-26 19:35) [16]
> ему не нужено его собственный обработчик сообщений, как
> я понял
Тогда пусть обработчик компонента вешает на OnMessage если ему это надо. Хотя, скорее всего, в самом HTTP-компоненте уже есть окно (по крайней мере большинство так делают). Тогда затык в другом месте может быть. В любом случае чтобы работало нужна правильная выборка сообщений. Для каждого потока своя! ProcessMessages обязательно нужно использовать, или перекопированный аналог.
← →
nester © (2004-02-27 15:30) [17]Господа, нашел ошибку, в общем ошибка еще глубже, она в самой компоненте.Эта компонента от ICS, которую ктото перелапатил под КОЛ. Переделаная HTTPCli не всегда верно обрабатывает ошибки 404 и таймаут. Автор переделаной версии попросту закомментировал все raise. На сайте КОТ лежит вот делаю глупую работу - взял последнюю версию от ICS и сам его перелопачиваю теперь. Точнее предпоследнюю - последняя еще бета
← →
nester © (2004-02-27 15:57) [18]Пропу прощение. не все он заккоментировал raise, а както выборочно
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.032 c