Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateThread, общение с TForm 
:(
    Опции темы
Romikgy
Дата 20.7.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Возник такой вопросец к гуру местмым smile

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

Вот и вопрос как правильно работать с формой, с переменными модуля и т.п. из потока???? smile

PS плюс если еще кто-то пояснит как работать с формой из потока созданного с помощью
CreateRemoteThread вообще ОГРОМНЕЙШИЙ сенкс smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
z-END
Дата 20.7.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 1
Всего: 102



при работе c формой из потока, необходимо использовать Synchronize
при использовании нескольких потоков необходимо использовать CriticalSection


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Romikgy
Дата 20.7.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(z @ 20.7.2005, 15:10)
при работе c формой из потока, необходимо использовать Synchronize

Насколько мне известно этот метод для дельфийского класса TThread, а я полmpe.cm API


Цитата(z @ 20.7.2005, 15:10)
CriticalSection


А это посмотрю спасибо smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Петрович
Дата 20.7.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 20.7.2005, 16:53)
Насколько мне известно этот метод для дельфийского класса TThread, а я полmpe.cm API

Ну, если сам на API, то и обеспечивай сам взаимоисключающий доступ к VCL.
Дело в том что VCL не реентерабельна.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 21.7.2005, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата
Дело в том что VCL не реентерабельна.

В смысле?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
poor_yorik
Дата 26.7.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 12.1.2005
Где: Общаги г. Киева

Репутация: нет
Всего: 8



Нельзя использовать большинство компонентов VCL в потоках.
Для этого ты должен унаследовать унаследовать класс от TTheard, написать какую-отдельную процедуру run с обращением к форме. Потом в методе Execute, ты пишешь процедуру потока
где и используешь Synhronize(Run).

--------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай...
PM MAIL YIM   Вверх
maxim1000
Дата 26.7.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



еще вариант - обеспечивать связь с формой не операциями с VCL компонентами, а посылкой сообщений, если, конечно, ситуация позволяет...


--------------------
qqq
PM WWW   Вверх
Romikgy
Дата 26.7.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



С классом ТТрид это понятно , но мне немного для другого, для работы с чужими компанентами на чужих формах smile поэтому делаю через апи и через CreateRemoteThread

Цитата(maxim1000 @ 26.7.2005, 10:47)
еще вариант - обеспечивать связь с формой не операциями с VCL компонентами, а посылкой сообщений, если, конечно, ситуация позволяет...


Можно конечно , если в своем приложении , однак см. выше


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Петрович
Дата 26.7.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 26.7.2005, 14:28)
но мне немного для другого, для работы с чужими компанентами на чужих формах

Т.е. имеется ввиду компонентами и формами принадлежащими другому процессу?
Добавлено @ 14:13
И еще, почитай темку Вывести в memo от 00000000 до 11111111. Там есть для тебя кое что интересное smile.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 26.7.2005, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата
Т.е. имеется ввиду компонентами и формами принадлежащими другому процессу?


Ага smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romikgy
Дата 26.7.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата
И еще, почитай темку Вывести в memo от 00000000 до 11111111. Там есть для тебя кое что интересное


Ага поучительно smile Спасибо.
Только возникает вопрос чем лучше beginthread , чем createthread?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Петрович
Дата 26.7.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 26.7.2005, 15:35)
Только возникает вопрос чем лучше beginthread , чем createthread?

В beginthread предусмотрены некоторые действия связанные с обработкой Exception возникающего в процедуре реализующей поток, и еще кое чего. В общем, читай хелп по beginthread smile


Цитата(Romikgy @ 26.7.2005, 15:25)
Цитата (Петрович @ 26.7.2005, 14:11)
Т.е. имеется ввиду компонентами и формами принадлежащими другому процессу?

Ага 

Странно, предполагаю что у тебя проблемы в чем-то другом.
А вообще, как ты работаешь "с чужими компанентами на чужих формах"? Приведи-ка пример.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 27.7.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



С Checklistbox я уже разобрался smile

Код

hproc:=OpenProcess(PROCESS_ALL_ACCESS,false,276); // здеся вводится пид процесса
if hproc<>0 then
 begin

 ListBox1.Clear;
 hw:= 12054; //здеся хендл нужного чеклистбокса
 GetWindowRect(hw,rc);
 ListBox1.Items.Add('top ' + inttostr(rc.Top ));
 ListBox1.Items.Add('left ' + inttostr(rc.Left));
 ListBox1.Items.Add('right ' + inttostr(rc.Right));
 ListBox1.Items.Add('bottom ' + inttostr(rc.Bottom));
  p:=SendMessage(hw,LB_GETCOUNT,0,0);
  ListBox1.Items.Add('klvo ' + inttostr(p));
  for j:=0 to p-1 do
  begin
 p:=SendMessage(hw,LB_GETITEMDATA,j,0);
 if p<>0 then 
 begin
 SendMessage(hw,LB_GETTEXT,j,dword(@pc));
ReadProcessMemory(hproc,pointer(p+8),(@buf),1,br); // здеся читаю память
ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttostr(dword(buf)));
 ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttohex(pbyte(p+8)^,1)+' '+strpas(pc)); // а здеся выводится если 1 чекбокс выбран, если ноль значит сброшен :)
 end;
 end;


 end;
/CloseHandle(hproc);


Это тестовый вариант но он работает smile

Это сообщение отредактировал(а) Girder - 27.7.2005, 16:20


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Петрович
Дата 28.7.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 27.7.2005, 13:25)

...
Это тестовый вариант но он работает

Вот это как раз странно.

1. Использование переменной p участвующей в выражении границ цикла в теле цикла это не есть хорошо.
2. Не вижу как определены переменные pc и buf, но у меня большие сомнения что ты правильно используешь сообщение LB_GETTEXT.
3. Ну а вот это:
Код

ReadProcessMemory(hproc,pointer(p+8),(@buf),1,br); // здеся читаю память
ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttostr(dword(buf)));
 ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttohex(pbyte(p+8)^,1)+' '+strpas(pc)); // а здеся выводится если 1 чекбокс выбран, если ноль значит сброшен :)

мне вообще кажется чрезмерно смелым способом работы! Особенно, все что касается (p+8).

Если у тебя и все остальное написанно в таком же стиле, то тогда вполне понятно почему это не работает как надо.
Добавлено @ 12:21
Прости если показался слишком резким. smile
Добавлено @ 12:23
Да, и еще. Можешь посмотреть как правильно работать с LB_GETTEXT в реализации метода TListBoxStrings.Get.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 28.7.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Дафай поочереди :

Цитата
1. Использование переменной p участвующей в выражении границ цикла в теле цикла это не есть хорошо.


Это не столь важно букву можно и поменять (т.е. переменную)


Цитата
2. Не вижу как определены переменные pc и buf,

pc: array [byte] of char;
Buf: byte;

Цитата
мне вообще кажется чрезмерно смелым способом работы! Особенно, все что касается (p+8).

Мож и смело, но это вышло после дизассемблирования участка кода с обычным обращением к компоненте.

Цитата
Прости если показался слишком резким. smile

Ниче как нибудь сочтемся smile

Цитата
Да, и еще. Можешь посмотреть как правильно работать с LB_GETTEXT в реализации метода TListBoxStrings.Get.

И в чем разница???

Код

function TListBoxStrings.Get(Index: Integer): string;
var
  Len: Integer;
  Text: array[0..4095] of Char;
begin
  Len := SendMessage(ListBox.Handle, LB_GETTEXT, Index, Longint(@Text));
  if Len < 0 then Error(SListIndexError, Index);
  SetString(Result, Text, Len);
end;


Вот исходник, в чем у меня отличие??? То что проверок нет??? ну дык это при написании так сказать релиза учтется smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1319 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.