1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381

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

08.10.2014, 20:12. Показов 5891. Ответов 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
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
13.10.2014, 12:22
Студворк — интернет-сервис помощи студентам
mss,
Код хоть бы проверили, прежде чем бестолково кнопки нажимать. При работе форму не закрыть, наверно таймер поставить надо? Ждус, умный совет.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
13.10.2014, 12:40
Цитата Сообщение от zimbabve Посмотреть сообщение
Ждус, умный совет.
Почитай книжку по работе с потоками, а не жди когда за тебя все напишут.
Цитата Сообщение от zimbabve Посмотреть сообщение
При работе форму не закрыть
Не закрыть ее из-за цикла, бесконтрольно запускающего потоки.
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
13.10.2014, 12:49
FIL,
здрасте. Да не, все нормально, mss одобрил. Там просто таймеры нужны.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.10.2014, 13:35
Цитата Сообщение от zimbabve Посмотреть сообщение
Там просто таймеры нужны.
Ты с дуба рухнул ?)
"Там" они нужны как корове седло.
0
7 / 7 / 4
Регистрация: 13.09.2013
Сообщений: 96
13.10.2014, 18:13
Цитата Сообщение от FIL Посмотреть сообщение
Почитай книжку по работе с потоками, а не жди когда за тебя все напишут.
Не по теме:
Я ему вроде бы кидал ссылку, Но пост дельнули( процентов на 60 я уверен что после прочитанного он бы тут не задавал вопросов
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
13.10.2014, 18:43
Цитата Сообщение от Molas Посмотреть сообщение
Я ему вроде бы кидал ссылку, Но пост дельнули( процентов на 60 я уверен что после прочитанного он бы тут не задавал вопросов
Читал "Многопоточность - как это делается в Дельфи. Не используйте потоки, не прочитав это".

mss прав оказался с советом, нужно было компонент таймера применить. Сделал, все без проблем сейчас. Учитесь у mss, он дело советует, лучший из лучших кодеров.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.10.2014, 20:57
Цитата Сообщение от zimbabve Посмотреть сообщение
mss прав оказался с советом, нужно было компонент таймера применить
Да что за ересь ты несешь ?)
Где я говорил про то что применение таймера избавляет от "проблем" ?)
Не было такого и быть не могло)
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
15.10.2014, 22:43  [ТС]
ребят, я так и не нашел решения. В общем по сути ка работать с потоком я понял, как передавать ему нужно строку я понял, но не знаю как сделать только вот что : как послать потоку каждый раз новую строку с стринглиста ? все время делать Thread1 := TMyThread.Create(stroka,True); не подойдет, т.к , если будет 2000 строк, то 2000 раз писать что ле ?) попытался сделать циклом , тоже не подошло т.к поток не хотел останавливаться, подскажите, как ?

Добавлено через 2 минуты
пожалуйста, не надо меня валить теорией и говорить загадками, просто покажите пример. Да, я знаю , что изучив теорию , там много чего найду, но сколько не смотрел , не читал нигде не было как посылать каждый раз новую строку потоку пока не закончатся строки в стринглисте. Благодарен за понимание
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
15.10.2014, 22:56
Цитата Сообщение от vuasya Посмотреть сообщение
как послать потоку каждый раз новую строку с стринглиста ?
Delphi
1
2
for i := 0 to sL.Count - 1 do
  TMyThread.Create(sL[i], True);
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
15.10.2014, 23:16  [ТС]
Delphi
1
2
3
[quote="FIL;6726372"]
for i := 0 to sL.Count - 1 do
* TMyThread.Create(sL[i], True);[/quote]
спасибо, но какая разница, я ведь приводил пример :
Delphi
1
2
3
for i := 0 to 100 do
   begin
  Thread1 := TMyThread.Create(inttostr(i),True);
по идее она должна только 100 раз сделать и усе, но продолжалась до бесконечности.

Испробую.

Добавлено через 7 минут
сделал так :
Delphi
1
2
3
4
5
6
7
8
9
10
 for k := 0 to sL.Count - 1 do  begin
  Thread1 := TMyThread.Create(sL[k],True);
  Thread1.Priority := tpidle ;
   Thread1.memo:= memo1;
    Thread1.memo2:= memo2;
     Thread1.memo3:= memo3;
  Thread1.ProgressBar := ProgressBar1;
  Thread1.Lbl := Label1;
  Thread1.Resume;
end;
но по прежнему до бесконечности она работает. Хоть sL содержит значение от 0 до 100 .
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
15.10.2014, 23:22
Цитата Сообщение от vuasya Посмотреть сообщение
но по прежнему до бесконечности она работает
Я тебе уже несколько раз писал
Цитата Сообщение от FIL Посмотреть сообщение
Если тебе цикл не нужет, так убери его
Цитата Сообщение от FIL Посмотреть сообщение
Цикл внутри потока.
, а не цикл запуска потоков - это разные вещи и циклы.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
15.10.2014, 23:30  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
а не цикл запуска потоков - это разные вещи и циклы.
ты же сам только что привел пример цикла запуска потоков

Цитата Сообщение от FIL Посмотреть сообщение
Код Delphi
for i := 0 to sL.Count - 1 do
* TMyThread.Create(sL[i], True);
Давайте по полочкам, потоков вы называете процедуру Execute ? или это называется доп. поток ? Тогда, что называется самим потоком ? create ? вроде как там созд. поток. Там и ставить цикл ?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
15.10.2014, 23:35
Потоками я называю доп. потоки, телом которых является процедура Execute и в этом теле у тебя, зачем-то, прописан бесконечный цикл.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
15.10.2014, 23:43  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Потоками я называю доп. потоки, телом которых является процедура Execute и в этом теле у тебя, зачем-то, прописан бесконечный цикл.
я в execute вообще не ставил цикл. Можешь подсказать правильный вариант отностительно моего примера ? на коде ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
15.10.2014, 23:47
Цитата Сообщение от vuasya Посмотреть сообщение
попытался сделать циклом , тоже не подошло т.к поток не хотел останавливаться
Доп.поток не останавливается не потому что его создание происходит в цикле, а потому что ты накосячил в методе Execute доп.потока

Сказано же черным по-русски - не лезь из доп.потока ни в форму ни в компоненты на ней !
Даже в синхронизированном с осн.потоком методе не лезь - нечего там доп.потоку делать)
О том, что поток закончил расчеты, он может известить другие заинтересованные потоки миллионом разных способов, например, уже встроенным событием OnTerminate, обработчик которого можно сделать методом формы, которая сама заберет у доп.потока рез-ты расчетов и выведет из при необходимости на свои мемо и прочие контролы.

Добавлено через 2 минуты
Цитата Сообщение от vuasya Посмотреть сообщение
Давайте по полочкам, потоков вы называете процедуру Execute ? или это называется доп. поток ? Тогда, что называется самим потоком ? create ?
Ты вот заявил, что теорию читать не желаешь, хотя там есть ответы на все эти вопросы.
И с примерами даже иногда.

какого лешего, спрашивается ?)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
15.10.2014, 23:52
Цитата Сообщение от vuasya Посмотреть сообщение
я в execute вообще не ставил цикл
А это чей код?
https://www.cyberforum.ru/post6713163.html
https://www.cyberforum.ru/post6713424.html
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
16.10.2014, 00:00  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
какого лешего, спрашивается ?)
я же писал, что там не описывается пример которым я задался. Нигде его нет. Нашел только пример с крит. секцией , который в 1 посте , но вы сказали, что этот метод никуда не годится. Начал искать другие , и решил спросить вас.
Цитата Сообщение от mss Посмотреть сообщение
Даже в синхронизированном с осн.потоком методе не лезь - нечего там доп.потоку делать)
так яж эти переменные засунул в структуру потока :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 TMyThread = class(TThread)
  private
    { Private declarations }
    FParam: String;
   FResult: String;
   sit2:tstringlist;
    procedure UpdateControls;
  protected
    procedure Execute; override;
  public
    ProgressBar: TProgressBar; //поле потока для подключения к TProgressBar
    Lbl: TLabel; //поле потока для подключения к информационной метке
    memo:Tmemo;
    memo2:tmemo;
    memo3:tmemo;
     constructor Create(AParam: String; CreateSuspended: Boolean);
  property Result: String read FResult;
  end;
тобишь сначала я их записываю туда, а потом уже из них в компоненты . яж при создании указываю
Delphi
1
2
3
Thread1.memo:= memo1;
    Thread1.memo2:= memo2;
     Thread1.memo3:= memo3;
Цитата Сообщение от mss Посмотреть сообщение
потому что ты накосячил в методе Execute доп.потока
поможете исправить ? чтоб останавливался поток ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.10.2014, 00:10
Цитата Сообщение от vuasya Посмотреть сообщение
так яж эти переменные засунул в структуру потока
Да по барабану куда ты их засунул !)
Компонентами формы-то они от этого быть не перестали)

Цитата Сообщение от vuasya Посмотреть сообщение
исправить ? чтоб останавливался поток ?
А ты циклы в теле Rxecute ликвидировал ?

Цитата Сообщение от vuasya Посмотреть сообщение
Нашел только пример с крит. секцией
Крит.секция защищает общий ресурс от одновременного к нему доступа.
Так а зачем его защищать, если нет очевидных противопоказаний к тому, чтобы он не был общим и его контролировал только основной поток, а другие потоки туда не лезли, ибо все что нужно для расчетов осн.поток сам им передаст при создании ?
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
16.10.2014, 00:30  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
А ты циклы в теле Rxecute ликвидировал ?
нет, я не трогал эту процедуру. Я ее даже не объявлял . Можете подсказать где ее найти и что там убрать ?

Добавлено через 1 минуту
а может просто в execute в конец написать Thread1.Terminate; ? или такой способ не подойдет ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.10.2014, 00:39
Цитата Сообщение от vuasya Посмотреть сообщение
я не трогал эту процедуру. Я ее даже не объявлял
Если ты ее не объявлял в своем наследнике, то зависнуть поток попросту не может.

Добавлено через 2 минуты
точнее зависнуть он при не перекрытом Execute может только если ты накосячил в перекрытом методе DoTerminate либо в назначенном тобой обработчике OnTerminate
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2014, 00:39

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

Правильно завершить поток
Здравствуйте!!! Делаю программу через поток. Вот код #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...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru