Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2011, 15:50   #1
palm
 
Регистрация: 10.02.2011
Сообщений: 6
По умолчанию Потоки, VCL и сеть

Код:
type
  TNewThread = class(TThread)
  private
    zapros:string;
    stroka:array[1..5] of integer;
    Http  : TidHttp;
    { Private declarations }

  protected
    procedure Execute; override;
    procedure Memo1;
    procedure Memo2;
  end;
...

var
   Form7: TForm7;
   NewThread: TNewThread;
   
procedure TNewThread.Memo1;
begin
 form7.memo2.Lines.Append(form7.combobox1.Items[form7.combobox1.ItemIndex]+inttostr(stroka[(form7.combobox1.ItemIndex+1)]));
end;
procedure TNewThread.Memo2;
begin
form7.memo1.Lines.append(form7.combobox1.Items[form7.combobox1.ItemIndex]+':'+ pars('<y_ok>',zapros,'</y_ok>'));
end;

procedure TNewThread.Execute;

begin
  form7.Button1.Enabled:=false;
  form7.edit1.Text:='abc';
  form7.edit2.Text:='def';
    try
   Http := TidHTTP.Create();
 
    Data := TStringList.Create;
    Data.Add('id='+inttostr(form7.combobox1.ItemIndex+1));
    Data.Add('login='+form7.edit1.Text);
    Data.Add('password='+form7.edit2.Text);
    zapros :=  Http.Post('http://abc.ru',Data);
    http.Disconnect;  //???

 if pars('<status>', zapros,'</status>')='1' then
     begin
 stroka[(form7.combobox1.ItemIndex+1)]:=stroka[(form7.combobox1.ItemIndex+1)]+1;
     Synchronize(Memo1);
     end;
     Synchronize(Memo2);
  
except
end;
В коде все не существенное убрал.Ну и в форме просто поток вызывается и все.
Вроде бы в не главном потоке не очень корректно обращ-я к элементам формы, наверно поэтому замечал у себя что в memo главной формы выво-я не вся обработанная информация.
Я вот и попробовал(не знаю так это делать или нет) создать TNewThread.Memo1 и TNewThread.Memo2 и синхронизировать главной и дочерний потоки. Скажите пожалуйста это так или нет делается?
Как скажем быть с stroka[(form7.combobox1.ItemIndex+1)]:=stroka[(form7.combobox1.ItemIndex+1)]+1;

Тоже создавать процедуру и синх-ть с главным потоком?
А если на форме очень много элементов (memo combobox label и тд)?
Если скажем 20 компонентов label не писать же для каждой процедуру и синхронизацию?

Заранее (если кто что понял в моей писание ) ) благодарен за ответ
palm вне форума Ответить с цитированием
Старый 10.03.2011, 22:59   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Если скажем 20 компонентов label не писать же для каждой процедуру и синхронизацию?
можно к примеру все записать в одной процедурею
Код:
procedure Tthread.showMsg;
begin
//переменная statemsg вычисляется вне процедуры синхронизации
  case statemsg of
  1: memo1.lines.add('msg1');
  2: memo2.lines.add('msg2');
  3: memo3.lines.add('msg3');
  else memoX.lines.add('что делаю, что творю?');
  emd;
end;
либо тоже самое написать в событии компонента TapplicationEvent
а в потоке использовать PostMessage.
почитайте
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.03.2011, 11:12   #3
palm
 
Регистрация: 10.02.2011
Сообщений: 6
По умолчанию

evg_m
Да я читал, все равно скажем не очень понятно)
Вот к примеру
Data.Add('password='+form7.edit2.Te xt);

Как эти строки корректно записать в потоке?

Ну и строка Data.Add('password='+form7.edit2.Te xt); честно совсем не могу понять как корректно в потоке добавить в стринглист значение компонента(в данном случае edit2.text)

// вот тут как я понял из вашего примера можно примерно так
statemsg:=1;
Synchronize(showMsg);
...
statemsg:=3;
Synchronize(showMsg);
Data.Add('password='+edit);
if pars('<status>', zapros,'</status>')='1' then
begin
statemsg:=2;
Synchronize(showMsg);
end;

procedure Tthread.showMsg;
begin
//переменная statemsg вычисляется вне процедуры синхронизации
case statemsg of
1: begin
form7.Button1.Enabled:=false;
form7.edit1.Text:='abc';
form7.edit2.Text:='def';
end;
2: begin stroka[(form7.combobox1.ItemIndex+1)]:=stroka[(form7.combobox1.ItemIndex+1)]+1;
form7.memo2.Lines.Append(form7.comb obox1.Items[form7.combobox1.ItemIndex]+inttostr(stroka[(form7.combobox1.ItemIndex+1)]));
end;
3:edit:=form7.edit2.Text; end;
else memoX.lines.add('что делаю, что творю?');
end;
end;
Эта конструкция правильная? Если я все правильно понял можно скажем завести переенную statemsg, варировать в зависимости от того что мы делаем ее значениями и когда нужно к компонентам формы обратится делаем Synchronize(showMsg); и в процедуре в зависимости от того что нам надо уже идет обращение к компонентам формы или скажем вычисление какого-то значения и передача его в наш поток.
palm вне форума Ответить с цитированием
Старый 11.03.2011, 12:09   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Эта конструкция правильная?
в общем все правильно.
Цитата:
Если я все правильно понял можно скажем завести переенную statemsg, варировать в зависимости от того что мы делаем ее значениями и когда нужно к компонентам формы обратится делаем Synchronize(showMsg);
в процедуре synchnize мы вправе обратиться к любым данным потока в том числе и
Код:
if pars('<status>', zapros,'</status>')='1' then
begin
statemsg:=2;
в этом случае даже специальная переменная будет не нужна.
Код:
if pars('<status>', zapros,'</status>')='1' then
begin
form7.Button1.Enabled:=false;
form7.edit1.Text:='abc';
но можно и использовать для облегчения самой процедуры.
Цитата:
и в процедуре в зависимости от того что нам надо уже идет обращение к компонентам формы или скажем вычисление какого-то значения и передача его в наш поток.
обычно достаточно просто считать нужные данные а он ПОТОМ уже сам все вычислит. Зачем нагружать основной поток вычислениями, если с этой задачей справится и сам рабочий поток.
Но помните любой вызов Synchronize останавливает текущий поток до окончания работы процедуры указанной в параметре.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.03.2011 в 12:12.
evg_m вне форума Ответить с цитированием
Старый 13.03.2011, 02:22   #5
palm
 
Регистрация: 10.02.2011
Сообщений: 6
По умолчанию

Спасибо, понятно в принципе все.

А вот скажем такая ситуация:
Имее форму на ней компоненты edit и button. Допустим по нажатию на кнопку мы просто начинаем считаем от 1 до 100 ждем чего-то и записывать значение в edit.
Вот решили мы это с помощью потока сделать. Мы на 100% уверены что в edit кроме нашего значения ничего не будет записываться.

Сделали мы так:
procedure Tthread.potok;
begin
case statemsg of
1: edit1.text:=inttostr(i);
end;

procedure TNewThread.Execute;
begin
for i:=1 to 100 do
begin
statemsg:=1;
Synchronize(potok);
sleep(10000);
end;
end;

А могли так:
procedure TNewThread.Execute;
begin
for i:=1 to 100 do
begin
edit1.text:=inttostr(i);
sleep(10000);
end;
end;

Что такого сверхординарного может произойти что наш 2-й вариант окажется не верным?
palm вне форума Ответить с цитированием
Старый 13.03.2011, 04:55   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

произойти может много чего, ведь Application в главном потоке продолжает получать и обрабатывать сообщения от Windows, которые, в том числе, вполне могут касаться и структур данных, связанных с edit1. Например, вашу форму с edit1 могли закрыть другим приложением, и в момент, когда ваш дополнительный поток пытается записать в него новый текст, windows запрашивает у VCL перерисовку edit1 из главного потока.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по VCL Андрей 93 Общие вопросы Delphi 1 18.12.2010 18:46
Перлы VCL Квэнди Свободное общение 7 13.02.2009 09:08
DynamicSkinForm VCL TaTT DoGG Компоненты Delphi 4 01.05.2008 16:28
VCL Э/\bФ_}{P Свободное общение 2 21.05.2007 00:21