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

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

08.10.2014, 20:12. Показов 5970. Ответов 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,978
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,978
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,978
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера 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
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru