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

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

08.10.2014, 20:12. Показов 5751. Ответов 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,977
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,977
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,977
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,977
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,977
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
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru