Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Вниз

Не получается вставить в поток небольшую (длительную) процедуру.   Найти похожие ветки 

 
Yuraz   (2002-11-29 09:54) [0]

Уважаемые мастера, подскажите как данную процедуру оформить в отдельный поток (thread), делаю вторую неделю, ничего поделать не могу :( раньше никогда с потоками не сталкивался. Тут описал свою задачу, это простая программа отправки данных методом POST скрипту в интернете. В данном виде работает. На форме кнопка, поле Edit1, поле Memo1 для вывода результата. Только если произвожу отсылку через медленную линию, или прокси сервер, форма приложения напрочь вешается, до тех пор, пока не примется последний байт ответа.

сам код действия без потока:

//###########################################
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
st: TMemoryStream; //сюда поступает ответ от сервера
send:string; // отсылаемая строка
begin
st:=TMemoryStream.Create;
try
//поле, отправляемое по интернету
send:="mail" + "=" + Edit1.Text;
//отсылаем в скрипт, принимающий данные, пересылаемая строка, принимаем ответ в st
ProxyHTTPpostURL(" http://127.0.0.1/post838.php", send, st);
st.Seek(0,soFromBeginning);
//показываем результат в memo1
Memo1.Lines.LoadFromStream(st);
finally
st.Free;
end;
end;
//###########################################



с потоками я делаю по такому шаблону, создаю Unit2 (Unit1 ниже):



//###########################################
unit Unit2;

interface

uses
Classes, SysUtils;

type
TSendThread = class(TThread)
private
//
protected
procedure Execute; override;
procedure Priem; //приём данных
end;

implementation

{ TSendThread }

uses
Unit1;

procedure TSendThread.Priem;

begin
//
end;


procedure TSendThread.Execute;

begin
// ...
// ...
Synchronize (AddMemo);
end;

end.

.

//###########################################

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit2,
StdCtrls, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
ST: TSendThread;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
ST := TSendThread.Create (False); // start
end;

//###########################################

в результате нечего не выходит, то при компиляции ругается, то в процессе выполнения, сейчас синтаксис вроде верный, как везде в статьях написанно. Главный вопрос, как разобраться, что писать в процедуру TSendThread.Execute, и что надо писать в процедуру, которую синхронизируем TSendThread.Priem в данном примере.
С уважением, Юрий.


 
Smithson   (2002-11-29 10:19) [1]

Ошибки здесь: Synchronize (AddMemo);
Пункт первый: Хто такой AddMemo()?
Пункт второй: Процедуры, вызванные через Synchronize, работают в основном потоке (но никак не в вызывающем), посему смысла в потоке нет.


 
Yuraz   (2002-11-29 11:09) [2]

Smithson © (29.11.02 10:19)
как тогда быть, если ответ идёт более 30 секунд, форма всё это время висит.


 
Yuraz   (2002-11-29 11:10) [3]

procedure TSendThread.Execute;

begin
// ...
// ...
Synchronize (Priem);
end;


 
Smithson   (2002-11-29 11:18) [4]

Синхронайз следует употреблять только для работ, связанных с обновлением VCL. RTFM же, блин! Читайте книжки!

procedure TSendThread.Execute;

begin
// ...
// ...
Priem();
end;


 
Yuraz   (2002-11-29 11:43) [5]

т.е. то что в SpeedButton1Click(Sender: TObject), кладу в Priem, а Priem вызываю в Execute, и в Memo1 строки будут добавлятся по мере поступления, не вешая форму ? ? ?
Хорошо, спасибо Smithson, у меня комп дома, оттестирую. Книги читаю, но мелочь не могу сделать, может хоть сейчас что то прояснится.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.097 c
1-28065
Arhangel
2002-11-27 19:42
2002.12.09
Package


4-28356
Бульбаш
2002-10-28 17:42
2002.12.09
Подскажите плиз в каком модуле RXLib находится функция


3-27857
voland34
2002-11-20 23:48
2002.12.09
трабла с indexfield for ClientDataSet


1-28130
Viginal
2002-11-28 15:48
2002.12.09
Помогите!!!


4-28371
Nimda
2002-10-25 15:26
2002.12.09
Стандартные диалоги Открыть/Сохранить файл...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский