powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа класса грузит основной поток
38 сообщений из 38, показаны все 2 страниц
Работа класса грузит основной поток
    #39595274
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В классе есть процедуры, некоторые из них выполняются по таймеру. Всё вместе подгружает основной поток, что делать? Для каждой процедуры создавать поток?
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595281
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554Для каждой процедуры создавать поток?

Или для каждой процедуры поток. Или один поток на все процедуры. Телепаты в отпуске, никто
не знает что у тебя за процедуры и зачем им таймер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595295
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554,

Выхода два:
1. Оптимизировать эти процедуры, чтобы они не грузили поток, в котором выполняются;
2. Запускать их в не основном потоке.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595352
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я недавно в программировании, dll и bpl(как я понял улучшенный аналог длл для работы с классами) выполняются в отдельном потоке?
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595362
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554dll и bpl(как я понял улучшенный аналог длл для работы с классами) выполняются в отдельном потоке?
Нет.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595544
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй почитать туториалы по OmniThreadLibrary

библиотека расчитанная на создание многопоточных программ в терминах "потоков данных", а не "потоков управления".

может быть это то, что тебе нужно.

заводишь несколько конвейеров, для разных типов данных, вешаешь на них свои сложные процедуры, и в основном потоке просто забрасываешь им во входные буфера кадры с данными и иногда снимаешь с выходных готовые.

но вообще, многопоточность - требует понимания и строгости. В частности твои "сложные процедуры" ,если ты их выносишь в отдельный поток, должны выполняться внутри себя и не лезть в основную программу. Должны быть черными ящиками, получил ВСЕ нужные данные, обработал, вернул результат.

Никаких там окошек с ошибками, запросов у пользователя настроек и прочего.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595546
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595549
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНикаких там окошек с ошибками, запросов у пользователя настроек и прочего.
можно и с ними, но в контексте

Ariochмногопоточность - требует понимания и строгости
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595550
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595551
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В яндексе вбейте в поиск "asynccalls taskex". Можно прямо по коду часть работы убрать в отдельный поток.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595552
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докможно и с ними, но в контексте

вот именно.

поэтому первое правило - НЕЛЬЗЯ

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

а потом он может быть до гуру дорастёт и весь VCL на фиберы перепишет.

но - потом.

а пока - нельзя.

сначала - правила, потом - исключения.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595556
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, да. AsyncCalls как очень простой OTL тоже всеьма неплох.
Был когда-то.
До 2010 года.

А сейчас есть стандартные TThread.Queue и TThread.CreateAnonymousThread - в общем они перекрывают AsyncCalls во многом, если не во всем
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595569
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

авторно вообще, многопоточность - требует понимания и строгости.

Глобально в многпоточности одна сложность - синхронизация между разными потоками. Как дополнительными так и основным. Почти любой код можно запихнуть в доп. поток или потоки, часто с минимальным переписыванием.
Добавил либу для распараллеливания, она не такая тяжеловесная, как омни. Можно посмотреть в строну TJvThread из жедаев.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595586
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо большое за ответы! Сейчас буду читать, изучать. Но прежде хотелось бы задать ещё один вопрос (возможно тупой), как посмотреть кол-во запущенный потоков в программе и желательно видеть их загрузку цп, может есть какая то программа?

По поводоу "кол-во запущенный потоков в программе", видел в инете можно самому код написать и узнать.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595592
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) самa Delphi во время выполнения программы список показывает - иди в меню View - debug windows - threads

2) Windows 7 (или 8, не помню) и до неё - SysInternals.com Process Explorer

3) Windows 8 (или 10, не помню) - Майкрософт купила SysInternals и функции P.E. появились в обычном диспетчере задач, Ctrl+Shift+Esc
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595596
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonне такая тяжеловесная, как омни

Омни монстровата, не отнять.

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

А если у тебя мало данных - то зачем тебе многопоточность? и новые классовые функции TThread на 99% достаточны.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595598
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только не удивляйся если у своего процесса увидишь больше потоков, чем ожидаешь. Виндовс -
гадкий вирус, она внедряет в чужие процессы свои собственные потоки с целями неясными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595601
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonДобавил либу для распараллеливания, она не такая тяжеловесная, как омни. Можно посмотреть в строну TJvThread из жедаев.
вот еще однофайловый готовый менеджер потоков :)
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595622
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прелесть той библиотеки в том, что она позволяет распараллелить куски кода по ходу выполнения. Проще всего - циклы (другие куски нужно в циклы превращать). Есть какой-то долгий цикл, поменяли одну строку кода, собственно, цикл, он уже обрабатывается параллельно (если данные, конечно, лежат как нужно). На самом деле - очень удобно. Я у себя счетные задачи и загрузку файлов ускоряю. Разница по скорости огромная (i7). Я, честно, сам не ожидал, думал в память 'упрётся', но нет, 4 ядра + ht дают примерно 6-7 кратное ускорение. От задачи, конечно, зависит.
Если нужно именно параллельное выполнение с основным потоком, то эта либа не подходит, увы. Либо обычный TThread, либо TJvThread, либо wadman'овская компонента.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595644
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonпозволяет распараллелить куски кода по ходу выполнения. Проще всего - циклы (другие куски нужно в циклы превращать)

Т.е. - параллельный цикл.

http://otl.17slon.com/book/chap04.html#highlevel-foreach

http://www.thedelphigeek.com/2010/06/omnithreadlibrary-20-sneak-preview-1.html

Также
http://otl.17slon.com/book/chap04.html#highlevel-join
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595658
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

а потом он может быть до гуру дорастёт и весь VCL на фиберы перепишет.

Есть руководства по фиберам (Fiber)?
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595659
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonЕсли нужно именно параллельное выполнение с основным потоком, то эта либа не подходит, увы.
+ win only
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595708
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554,

Начни с изучения предметной области, а НЕ с библиотек, и даже не со стандартного TThread. Что такое поток (ЧЕГО поток) и так далее.
Пойми, почему нельзя бездумно использовать одни ресурсы в разных потоках. Поймешь - узнай, что нужно делать для того, чтобы использовать одни ресурсы в разных потоках (если уж очень надо такое использование).
Как и за счет чего потоки могут ждать друг друга (если это требуется).
Как ведет себя операционка при старте/завершении потока, что вообще происходит при этом.
Внимательно изучи документацию разработчика операционки по функции старта потока.
И еще много всякой теории.
Потом можно начинать пробовать (стандартный TThread или библиотеку - не важно).
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595733
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

нет, был только чей-то проект у кого-то в блоге

это ведь надо переписывать ВЕСЬ VCL
потом ВСЕ сторонние компоненты-библиотеки для VCL
потом ВСЕ мало-мальски сложные программы

тут "за три урока для чайника" не напишешь
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595777
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,
это ведь надо переписывать ВЕСЬ VCL
потом ВСЕ сторонние компоненты-библиотеки для VCL
потом ВСЕ мало-мальски сложные программы

Да что-нибудь базовое основы :)
В indy10 нашел реализацию fibers.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595778
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
базовое будет без VCL - это либо обсуждение на чистов Windows API, либо вообще теоретическое в отрыве от любых операционок
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595811
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

Код: pascal
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.
Constructor TSearh.Create;
begin
  inherited Create(true);
  FreeOnTerminate := true;
  Priority := tpNormal;
  Resume;
end;

procedure TSearh.Execute;
var
  wnd: integer;
  WinClass: string;
  WinTitle: string;
begin
  while not terminated do
  begin
    wnd := GetWindow(GetTopWindow(0), gw_hwndfirst);
    while wnd <> 0 do
    begin
      if (wnd <> Application.Handle) and    // Если окно не собственное
         (GetWindow(Wnd, gw_Owner) = 0) and // И не дочернее
         (IsWindowVisible(Wnd)) then        // Видимое
      begin
        WinTitle := MF.GetWindowTitle(wnd);
        if (WinTitle <> '') then
        begin
          WinClass := MF.GetWindowClass(wnd);
             MF.FLogs.Add('+++', inttostr(wnd), WinClass + ' | ' + WinTitle);
        end;
      end;
      wnd := GetWindow(wnd, gw_hwndnext);
    end;

    Sleep(1000);
  end;
end;





Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
//------------------------------------------------------------------------------
// Получить заголовок окна
//------------------------------------------------------------------------------
function TMF.GetWindowTitle(wnd: HWND): string;
var
  buffer: array[0..255] of Char;
begin
  GetWindowText(wnd, buffer, SizeOf(buffer));
  Result := buffer;
end;

//------------------------------------------------------------------------------
// Получить класс окна
//------------------------------------------------------------------------------
function TMF.GetWindowClass(wnd: HWND): string;
var
  buffer: array[0..255] of Char;
begin
  GetClassName(wnd, buffer, SizeOf(buffer));
  Result := buffer;
end;





Нажимаю несколько раз Запустить/Остановить выполнение потока, иногда всё норм, иногда WinClass = WinTitle
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595843
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изолировал, вырезав код в отдельную программу, тоже самое.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595872
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554Изолировал, вырезав код в отдельную программу, тоже самое.

http://www.sql.ru/forum/actualfile.aspx?id=21161642] Приложенный файл (1.rar - 59Kb)
Error554
Код: pascal
1.
2.
3.
4.
5.
wnd <> Application.Handle

MF.GetWindowTitle

WinClass := MF.GetWindowClass


Смотрю, ты не удосужился почитать об использовании общих ресурсов разными потоками...


Error554Нажимаю несколько раз Запустить/Остановить
А надо не нажимать, а запускать/останавливать. Забыл Button1Click и Button2Click реализовать?
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595874
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockА надо не нажимать, а запускать/останавливать. Забыл Button1Click и Button2Click реализовать?
А, не увидел проекта прикрепленного.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595883
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockСмотрю, ты не удосужился почитать об использовании общих ресурсов разными потоками...
Разные потоки, это созданный мною поток и главный поток?
И к общим ресурсам относятся процедуры, функции, переменные основного потока?
Так основной поток не использует процедуры GetWindowTitle и GetWindowClass, а вот Application.Handle может где то использоваться.
Я знаю, что при создании нескольких, своих, потоков и при обращении из них к VCL объектам нужно использовать специальный метод - синхронизациz.
Но не думал (и не видел в самых первый статьях из поиска по теме потоки), что для обращения к общим ресурсам ещё что то нужно. Ок, пошёл искать, читать.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595967
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554Разные потоки, это созданный мною поток и главный поток?Да.
Error554И к общим ресурсам относятся процедуры, функцииНет.

Я уже писал, что для начала (обучения) надо понять хотя бы, поток ЧЕГО.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39595968
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554Я знаю, что при создании нескольких, своих, потоков и при обращении из них к VCL объектам нужно использовать специальный метод - синхронизациz.Хрень ты "знаешь", забудь.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39596110
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554Я знаю, что при создании нескольких, своих, потоков и при обращении из них к VCL объектам нужно использовать специальный метод - синхронизациz.Так какого хрена не используешь? По крайней мере поменяй
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
              MF.Memo1.Lines.Add(inttostr(wnd) + ' | ' + WinClass + ' | ' + WinTitle);

на

          TThread.Queue(nil,
            procedure ()
            begin
              MF.Memo1.Lines.Add(inttostr(wnd) + ' | ' + WinClass + ' | ' + WinTitle);
            end);

А вообще уточни конкретнее что у тебя должно делаться, а то пример слишком искусственный
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39596128
Error554
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
white_nigger, да там только из этого потока Memo используется, больше нигде (и в основном тоже). Поэтому не стал применять синхронизацию.
Сейчас всё работает. У функции, которая получает имя класса окна, заменил SizeOf на Length.
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39596131
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554больше нигде (и в основном тоже)ошибаешься
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39596242
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554white_nigger, да там только из этого потока Memo используется, больше нигде (и в основном тоже). Поэтому не стал применять синхронизацию.
Сейчас всё работает. У функции, которая получает имя класса окна, заменил SizeOf на Length.Именно тот код который в архиве, с предложенным мной TThread.Queue потокобезопасен. Другое дело что у тебя в реальном приложении может по-другому реализовано. В-общем, надеюсь, ты мысль уловил. Ничего сверхъестественного в синхронизации нет, если включить голову
...
Рейтинг: 0 / 0
Работа класса грузит основной поток
    #39596922
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Error554да там только из этого потока Memo используется

ты все таки пройдись по моим ссылкам, там правда по английски, но всё же

обновлять Memo должен

1) основной поток
2) не чаще, чем 2-3 раза в секунду
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа класса грузит основной поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]