Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381

Правильно ли организован поток?

08.10.2014, 20:12. Показов 5759. Ответов 94
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, задался таким вопросом, а правильно ли составлен этот код потока, основан на критической секции. привожу :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TPotok.Execute;
var memolines:tstringlist;
begin
 while Work do
  begin
   CS.Enter;
    Inc(cc); 
    if cc<Peremennya.Count-1 then Cur:=cc else Work:=false;
   CS.Leave;
   if Work then
    begin
// тут всякие действия, к примеру
memolines:=tstringlist.create;
memolines.add('Stroka = '+Peremennya[Cur]);
     Synchronize(Sync);
    end;
  end;
 dec(Thread);
end;
 
procedure TPotok.Sync;
begin
form1.memo1.lines.add(memo1.lines.text);
end;
Вызываю так :
Delphi
1
2
3
4
5
6
7
cc:=-1;
 Work:=true;
 for Thread:=0 to strtoint(sEdit1.TExt) do
 begin
  TPotok.Create(false);
 end;
  Thread:=strtoint(sEdit1.TExt);
Ибо иногда выполняет выводит одни и те же строки. Плохо работает с idhhtp , синапсом. Иногда просто не догружает страницу.(с прокси) да и без прокси иногда. Может я не правильно реализовал ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2014, 20:12
Ответы с готовыми решениями:

Правильно вызвать поток
Вызываю поток следующим образом repeat for Thread3:=0 to form3.sSpinEdit1.Value do begin with TStas.Create(true) do begin ...

Правильно ли организован поток в приведенном коде
Всё ли я правильно делаю? Почему в цикле на Table не ругается, а на ТекстБокс ругается? bool flag = false;; Thread _t =...

Правильно ли организован ввод строки
Всем добрый день! Подскажите, правильно ли я ввожу строку? //---------------------------------------------------------------------------...

94
7 / 7 / 4
Регистрация: 13.09.2013
Сообщений: 96
11.10.2014, 22:49
Студворк — интернет-сервис помощи студентам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
unit Unit4;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin;
 
type
  TTPot = class(TThread)
  private
  SA:string;
    Ind, I1, I2: Integer;
    procedure AddLog;
    procedure Stop;
  protected
    procedure Execute; override;
  public
    constructor Create(Index, a1, a2: Integer);
  end;
 
type
  TForm4 = class(TForm)
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Button1: TButton;
    AUsers: TListBox;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form4: TForm4;
  Peremenaya:TStringList;
 Stoped: Boolean = True;
implementation
 
{$R *.dfm}
 
constructor TTPot.Create(Index, a1, a2: Integer);
begin
  inherited Create(True);
  Ind := Index;
  sa:='';
  I1 := a1;
  I2 := a2;
  FreeOnTerminate := True;
  Resume;
end;
 
procedure TTPot.AddLog;
begin
FOrm4.Memo1.Lines.Add(Sa);
end;
 
procedure TTPot.stop;
begin
  Form4.Button2.click;
end;
 
procedure TForm4.Button1Click(Sender: TObject);
var
I2:Integer;
begin
Stoped:=false;
Peremenaya.LoadFromFile('Open.txt');
I2 := Peremenaya.Count - 1;
TTPot.Create(0, 0,I2);
end;
 
procedure TTPot.Execute;
procedure AL(S: string);
begin
SA :=  S;
Synchronize(AddLog);
end;
var
I:integer;
begin
for I := 0 to Peremenaya.Count - 1 do
begin
if Stoped = True  then
begin
AL('Остановлено..');
Synchronize(Stop);
Exit;
end;
AL(IntToStr('Строка: '+Inttostr(i)));
end;
AL('Окончили');
end;
 
procedure TForm4.Button2Click(Sender: TObject);
begin
Stoped:=true;
end;
 
procedure TForm4.FormCreate(Sender: TObject);
begin
Peremenaya:=TStringList.Create;
end;
 
end.
а зачем тут нужна многопоточность я так и не понял
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
11.10.2014, 23:09
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TTPot.stop;
begin
  Form4.Button2.click;
end;
 
procedure TTPot.Execute;
...
Synchronize(Stop);
...
end;
 
procedure TForm4.Button2Click(Sender: TObject);
begin
Stoped:=true;
end;
Что-то новое.
Не понятно, к чему этот весь код? Тема о другом.
0
7 / 7 / 4
Регистрация: 13.09.2013
Сообщений: 96
11.10.2014, 23:12
может быть к остановке потока?ну тебе никто не запрещает использовать OnTerminate
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
11.10.2014, 23:15  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
пусть это делает основной поток. Разве этому что-то мешает
ты имеешь в виду при нажатии на кнопку сделать это (тобишь при Create) как показал zimbabve ?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  Thread: TMyThread;
begin
  Memo2.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do
   begin
   Thread := TMyThread.Create(Memo1.Lines[i], True);
   Thread.OnTerminate := HandleThreadResult;
   Thread.FreeOnTerminate := True;
   Thread.Resume;
   Application.ProcessMessages;
  end;
end;
zimbabve , а если мне нужно многое проделать (к примеру гет запрос, взять исх код и спарсить нужную инфу ),то это проделывать в Execute ? тогда нужна синхронизация ...
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
11.10.2014, 23:35
Цитата Сообщение от vuasya Посмотреть сообщение
тогда нужна синхронизация
Для чего?
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
11.10.2014, 23:37
vuasya,
я этот код набросал по шаблону mss. При выполнении, не закрыть форму и если перетаскивать форму останавливается работа. Может накосячил, может сам шаблон кривой. Нужно ждать mss, разобраться что не так.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
11.10.2014, 23:40  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Для чего?
так вроде бы с потока нельзя обращаться к vcl объектам формы , для этого существует вроде бы синхронизация ...

Добавлено через 1 минуту
Цитата Сообщение от vuasya Посмотреть сообщение
примеру гет запрос, взять исх код и спарсить нужную инфу ),то это проделывать в Execute
это все проделывать в execute ? (используя твой пример и mss )
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
11.10.2014, 23:41
Цитата Сообщение от vuasya Посмотреть сообщение
нельзя обращаться к vcl объектам формы
Цитата Сообщение от vuasya Посмотреть сообщение
к примеру гет запрос, взять исх код и спарсить нужную инфу
Для Гет-запроса и парсинга не нужны vcl-объекты.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
11.10.2014, 23:47  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Для Гет-запроса и парсинга не нужны vcl-объекты.
ты не понял, мне выводить инфу о проделанной работе нужно выводить в vcl объекты. Тобишь сделаю гет, спарсю нужную инфу и выведу эту инфу в вкл-объекты
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
11.10.2014, 23:56
Ты их можешь вывести в обработчике OnTerminate.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 00:12  [ТС]
т.е будет что-то вроде этого :

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
type
  TMyThread = class(TThread)
  private
   FParam: String;
   FResult: String;
   parsi:strng;
  protected
  procedure Execute; override;
  public
  constructor Create(AParam: String; CreateSuspended: Boolean);
  property Result: String read FResult;
end;
 
constructor TMyThread.Create(AParam: String; CreateSuspended: Boolean);
begin
  inherited Create(True);
   FParam := AParam;
end;
 
procedure TMyThread.Execute;
var http: httpsend;
src:tstringlist;
begin
  FResult := FParam;
http:= httpsend.create;
 
http.httpmethod('GET','http://site.ru'+Memo1.Lines[i]);
src:=tstringlist.create;
src.LoadFromStream(HTTP.Document);
parsi:=Pars('ot', utf8toansi(src.Text), 'do');
    
end;
 
procedure TMyThread.OnTerminate;
begin
memo2.lines.add(parsi);
    
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
 if OpenDialog1.Execute then
 begin
  Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
 end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  Thread: TMyThread;
begin
  Memo2.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do
   begin
   Thread := TMyThread.Create(Memo1.Lines[i], True);
   Thread.OnTerminate := HandleThreadResult;
   Thread.FreeOnTerminate := True;
   Thread.Resume;
   Application.ProcessMessages;
  end;
end;
 
procedure TForm1.HandleThreadResult(Sender: TObject);
begin
  with TMyThread(Sender) do
   Memo2.Lines.Add(Result);
end;
исправьте пожалуйста , если что то сделал не так
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 00:41
У тебя обработчиком OnTerminate назначается HandleThreadResult.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 10:48  [ТС]
спасибо, просто сразу сюда писал , не проверял в delphi , а так в целом правильно ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 20:29
Цитата Сообщение от zimbabve Посмотреть сообщение
что тогда у меня неправильно в коде (с этими, как его яй..ми)?
Да все вроде в рамках относительного приличия)..

Цитата Сообщение от zimbabve Посмотреть сообщение
Форма у программы виснет, спасает Application.ProcessMessages. При перетаскивании формы, программа останавливает работу
А причем здесь код поточного класса ? Он тут вообще не причем)
Холодный старт потока - операция сама по себе времяресурсоемкая.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 20:40  [ТС]
сделал про принципу как сказал mss и показал zimbabve , все хорошо, но проблема одна, не хочет останавливаться . Я ему дал цикл до 100 , а он все время гоняет. Вот код :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var i:integer;
begin
 for i := 0 to 100 do
   begin
  Thread1 := TMyThread.Create(inttostr(i),True);
  Thread1.Priority := tpidle ;
   Thread1.memo:= memo1;
    Thread1.memo2:= memo2;
     Thread1.memo3:= memo3;
  Thread1.ProgressBar := ProgressBar1;
  Thread1.Lbl := Label1;
  Thread1.Resume;
end;
 
// тут уже юнит потока 
 
constructor TMyThread.Create(AParam: String; CreateSuspended: Boolean);
begin
  inherited Create(True);
   FParam := AParam;
end;
 
procedure TMyThread.Execute;
var
  i: Integer;
   f:Integer;
   CurAcc, TP:integer;
    HTTP:THTTPSend;
    IP, Port:string;
    data:TStringStream;
    HTML, src:TStringList;
begin
  while Terminated = False do
  begin
 HTTP:=THTTPSend.Create;
     with HTTP do begin
           MimeType:='application/x-www-form-urlencoded';
      UserAgent:= 'Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1';
     end;
       HTTP.HTTPMethod('GET',PChar('http://yaca.yandex.ua/yca/cat/'+FParam+'.html?text='+URLEncode1('Privet 1')+'&ncrnd=22&nocookiesupport=yes'));
       if pos('200', HTTP.Headers.Text)<>0 then  begin
       src:=Tstringlist.Create;
      sit2:=Tstringlist.Create;
     src.LoadFromStream(HTTP.Document);
   ParseStr(src.Text, '<h3 class="b-result__head"><a href="http://', '/', sit2);
  end;
 Synchronize(UpdateControls);  // синхронизируемся с методами VCL
  end;
end;
 
procedure TMyThread.UpdateControls;
begin
memo.Lines.Add(sit2.Text) ;
  ProgressBar.Position := ProgressBar.Position + 1;
  if ProgressBar.Position >= ProgressBar.Max then
    ProgressBar.Position := 0;
  Lbl.Caption := IntToStr(ReturnValue);
 
end;
Все время идет гет запрос, повторы,повторы и еще раз повторы гоняет. Как быть ? можете тыкнуть носом где я сделал не так ?

Добавлено через 4 минуты
мне нужно чтоб он сделал только 100 гет запросов (от 1..до 100 ). Он делает, но не может остановиться .
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 20:44
Цитата Сообщение от vuasya Посмотреть сообщение
сделал про принципу как сказал mss
Ты ни-че-го не понял из того что я сказал.
Абсолютно ничего.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 21:07  [ТС]


Добавлено через 48 секунд
а что не так ? можешь написать пример кода , как примерно написал zimbabve , дальше я буду разбирать
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 21:12
Для чего у тебя поток крутится в бесконечном цикле?
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 21:14  [ТС]
я думал, что так я смогу реализовать такую вещь : 1 поток берет 1 строку и с ней работает , таким образом...
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 21:15
Цитата Сообщение от vuasya Посмотреть сообщение
1 поток берет 1 строку и с ней работает
Ну так он с ней и работает... до изнемождения)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2014, 21:15

Правильно завершить поток
Прошу помощи людей, хорошо разбирающихся в многопоточности. Из-за зависания формы приложения во время долгого выполнения (не отвечают...

Правильно завершить поток
Здравствуйте!!! Делаю программу через поток. Вот код #include &lt;vcl.h&gt; #pragma hdrstop #include &quot;UTime1.h&quot; ...

Как правильно завершать поток?
есть код: #include &quot;stdafx.h&quot; DWORD WINAPI PoolThread(LPVOID); int _tmain(int argc, _TCHAR* argv) { while(1) { HANDLE...

Как правильно отправить в поток?
Приветы всем. Помогите разобраться с потоками на простом примере. Ситуация бывает такая, при открытии большого количества файлов,...

Как правильно закрыть поток
Доброго времени суток. Не могу закрыть поток в методе. private static int intScaner() { BufferedReader in = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru