powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа класса грузит основной поток
13 сообщений из 38, страница 2 из 2
Работа класса грузит основной поток
    #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
13 сообщений из 38, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа класса грузит основной поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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