Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.038 c
3-1088494421
souLLamer
2004-06-29 11:33
2004.07.25
SQL - игнорирование регистра букв.


1-1089697212
Константин2000
2004-07-13 09:40
2004.07.25
USB принтер программируем


4-1086833436
James Bond
2004-06-10 06:10
2004.07.25
Монстры API! Подскажите все же как вставить в MaskEdit картинку


3-1088411549
MORA
2004-06-28 12:32
2004.07.25
InterBase SERVER


3-1088664487
AlexanderSK
2004-07-01 10:48
2004.07.25
Ошибка при восстановление БД из backup-а





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский