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

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

08.10.2014, 20:12. Показов 5753. Ответов 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
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 21:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vuasya Посмотреть сообщение
что не так ?
Абсолютно все не так.
Тебе про фому, а ты про ерему
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 21:18  [ТС]
вот именно, а мне надо чтоб только 1 раз с ней поработал, а он ее по кругу гоняет .... как быть ? а может написать что то виде TMyThread.free в конце execute ? чтоб убить именно этот поток ... можете подсказать ?

Добавлено через 1 минуту
Цитата Сообщение от mss Посмотреть сообщение
Тебе про фому, а ты про ерему
поможете переделать код ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 21:19
Цитата Сообщение от vuasya Посмотреть сообщение
1 поток берет 1 строку и с ней работает
Он ее из переданного в конструкторе параметра должен брать !
И в форму он не должен лезть вообще)
Поток, знающий о существовании форм, есть говнопоток, рано или поздно приводящий к малым и большим проблемам)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 21:19
Цитата Сообщение от vuasya Посмотреть сообщение
мне надо чтоб только 1 раз с ней поработал
Если тебе цикл не нужет, так убери его))
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
12.10.2014, 21:20
Цитата Сообщение от mss Посмотреть сообщение
Абсолютно все не так.
Тебе про фому, а ты про ерему
Покажите пример со списком текста, мне тоже интересно стало.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 21:22  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Он ее из переданного в конструкторе параметра должен брать !
ну так яж ее туда и посылаю , в моем случае :
Delphi
1
2
3
 for i := 0 to 100 do
   begin
  Thread1 := TMyThread.Create(inttostr(i),True);
Цитата Сообщение от FIL Посмотреть сообщение
Если тебе цикл не нужет, так убери его))
а тогда как передать именно 1 строку и именно 1 потоку чтоб друге не брали ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 21:24
zimbabve, какой тебе еще пример ?
Пример со списком - тот же самый мой пример без списка. Никаких принципиальных отличий нет)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 21:24
Цитата Сообщение от vuasya Посмотреть сообщение
а тогда как передать
Цикл внутри потока.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 21:28  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Цикл внутри потока.
что то вроде этого :
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
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
for i:=0 to 100 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;
end;
?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 21:29
Цитата Сообщение от vuasya Посмотреть сообщение
ну так яж ее туда и посылаю
Послал - молодец)
Цикл в доп.потоке зачем ?
И зачем лезешь в форму ?
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
12.10.2014, 21:29
Цитата Сообщение от mss Посмотреть сообщение
Пример со списком - тот же самый мой пример без списка. Никаких принципиальных отличий нет)
https://www.cyberforum.ru/post6709379.html
Так что тогда я неправильно написал? Если при перетаскивании формы, приостанавливается работа? И форму не закрыть, пока не закончится выполнении работы софта?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 21:29
Цитата Сообщение от vuasya Посмотреть сообщение
что то вроде этого
Ты понимаешь разницу межну "убрать цикл" и "добавить цикл"?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 21:42
Цитата Сообщение от zimbabve Посмотреть сообщение
Так что тогда я неправильно написал? Если при перетаскивании формы, приостанавливается работа? И форму не закрыть, пока не закончится выполнении работы софта?
Да все ты правильно написал)
Но класс потока из моего примера, коим ты воспользовался, к наблюдаемой тобой проблеме не имеет никакого отношения - проблему создал ты сам, а не приведенный мною простейший класс потока)

Поток честно стартует, честно и вовремя делает свое дело, формирует результат и закругляется.
И не его проблема что результат этот ты пытаешься получить таким немудреным способом - с использованием встроенного синхронизатора, причем в самый неподходящий для этого момент)
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
12.10.2014, 22:08
Цитата Сообщение от mss Посмотреть сообщение
Да все ты правильно написал)
Но класс потока из моего примера, коим ты воспользовался, к наблюдаемой тобой проблеме не имеет никакого отношения - проблему создал ты сам, а не приведенный мною простейший класс потока)
Поток честно стартует, честно и вовремя делает свое дело, формирует результат и закругляется.
И не его проблема что результат этот ты пытаешься получить таким немудреным способом - с использованием встроенного синхронизатора, причем в самый неподходящий для этого момент)
Тяжело вас понять. Написал все правильно, но создал сам проблему.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
12.10.2014, 22:28  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Ты понимаешь разницу межну "убрать цикл" и "добавить цикл"?
если я цикл уберу , то как я пошлю потоку именно одну строку и чтоб другие потоки его не брали ?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.10.2014, 22:32
zimbabve, еще раз:
приведенный мною шаблон поточного класса при его встраивании в твой собственный код к наблюдаемым при этом "тормозам" отношения не имеет.

Здесь нужно отчетливо понимать важные вещи:

1. Создание нового потока - тяжелая по времяемкости блокирующая системная операция.

2. Бессмысленно , вредно и рисковано создавать кол-во одновременно существующих доп.потоков, в десятки и сотни раз превышающее кол-во процессоров/ядер.

3. Обработчик OnTerminate, всегда вызываемый в осн.потоке, должен быть как можно менее времяемким и по возможности не порождающим времяемкие синхронные (т.е. ожидающие обработки) оконные сообщения

Добавлено через 2 минуты
Цитата Сообщение от vuasya Посмотреть сообщение
как я пошлю потоку именно одну строку
Параметром конструктора.

Цитата Сообщение от vuasya Посмотреть сообщение
и чтоб другие потоки его не брали
У тебя поток, раздающий строки, разве не знает кому и что он раздал ?
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
12.10.2014, 23:15
Цитата Сообщение от mss Посмотреть сообщение
Здесь нужно отчетливо понимать важные вещи:
1. Создание нового потока - тяжелая по времяемкости блокирующая системная операция.
2. Бессмысленно , вредно и рисковано создавать кол-во одновременно существующих доп.потоков, в десятки и сотни раз превышающее кол-во процессоров/ядер.
3. Обработчик OnTerminate, всегда вызываемый в осн.потоке, должен быть как можно менее времяемким и по возможности не порождающим времяемкие синхронные (т.е. ожидающие обработки) оконные сообщения
Поэтому попросил посмотреть ошибки, показать правильный пример. Ваш ответ на это, что не нужен пример, все правильно написал. Но откуда-то появляются с работой проблемы и допущенные мной ошибки, которые я должен найти как-то сам, без помощи. Интересная логика.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.10.2014, 09:25
Цитата Сообщение от zimbabve Посмотреть сообщение
которые я должен найти как-то сам, без помощи
Т.е. в посте #56 это не помощь ? Это я там сам себе что-то непотребное бухтел, так надо понимать ?)
Интересная логика)
Точнее - интересное отсутствие оной.
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 12
13.10.2014, 09:45
mss,
По вашему шаблону был написан код, где наблюдается работа с проблемами, они были описаны. Вы пишите, что правильно написан код и тут же пишите, что допущены ошибки. Попросил вас, дать пример или поправить код, вы начинаете вилять хвостом и нести всякую чушь, вместо поправок. Если нет желания показать правильную реализацию, то стоит как нормальному человеку сообщить об этом, а не придуриваться.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.10.2014, 11:36
zimbabve, гонор умерь.

Цитирую тебя:
Ну и код, нашли чему советовать. Форма у программы виснет, спасает Application.ProcessMessages. При перетаскивании формы, программа останавливает работу.
1.
Форма у программы виснет, спасает Application.ProcessMessages

И что ? Какие у тебя претензии конкретно к поточному классу ? Вызывать тебе или не вызывать Application.ProcessMessages в основном потоке - это не его забота !
Поток ничего не знает и не обязан знать ни о каких формах.

2.
При перетаскивании формы, программа останавливает работу
Не останавливает, а возможно осн.поток попросту не реагирует на сообщения.
Опять же это не проблема поточного класса.

Убедись сам - убери доп.поток вообще, кинь на форму, скажем, таймер, в его обработчике выводи что-нибудь в мемо на форме. Теперь хватай-таскай изо всех сил форму мышью и увидишь ту же картину - мемо не будет (или будет очень редко) обновляться, пока ты не отпустишь форму.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2014, 11:36

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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