Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Можешь начать отсюда: http://msdn.microsoft.com
И да поможет тебе поиск
 
P.S.
Но лучше иметь в локальном варианте

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 12:27 27-09-2006
Hazard



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста вариант решения такой проблемы:
 
Имеется главная форма
в ней есть две функции
ф1 вызывает ф2 с параметрами
ф2 работает с TWebBrowser
Если вызывать из самой формы ф1 - TWebBrowser отрабатывает.
Есть Thread
как из него вызвать ф1 и не получить "He был пpoизвeдeн вызoв CoInitialize."
Я понимаю что все делов в CoInitialize(nil) и CoUnInitialize, но где и как их прописывать ?
ActiveX и uses есть,
initialization
  CoInitialize(nil);
finalization
  CoUnInitialize;
перед "end." в Thread не помогает
 

Всего записей: 750 | Зарегистр. 03-10-2001 | Отправлено: 16:06 27-09-2006
Dmitry

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в функции  потока в начале вызвать CoInitialize(nil), а в конце CoUnInitialize

Всего записей: 81 | Зарегистр. 24-09-2003 | Отправлено: 16:12 27-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hazard
Попробуй сделать вызов из Thread через метод Synchronize.
например так:

Код:
 
procedure TMyThread.PushTheButton;
begin
  Button1.Click();
end;
 
procedure TMyThread.Execute;
begin
  ...
  Synchronize(PushTheButton);
  ...
end;
 

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 16:13 27-09-2006
Shweper



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте Вопрос такой. Вставил я в форму объект TShockwaveFlash и вылазит он всё время на передний план, а я хочу на него положить например TImage. Все "НА передний план" и "На задний план" почему-то в данном случае срабатывают только если речь идет о двух флешках, а флешку и рисунок никак... Может кто-нибудь что-нибудь сказать? Использую Delphi5

Всего записей: 416 | Зарегистр. 15-08-2005 | Отправлено: 16:19 27-09-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Shweper
TImage - наследник от TGraphicControl - то есть не является отдельным виндовым контролом, а рисуется самой формой по ее канвасу (как и TLabel). Виндовые контролы такие рисунки перекрывают.
Чтобы картинка была поверх контрола положи ее на TPanel, которая уже лежит на форме

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 16:52 27-09-2006
Hazard



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dmitry
Если бы все было так просто - я бы не спашивал

Цитата:
 
procedure myThread.Execute;
begin
CoInitialize(nil);
 
//мой код
 
CoUnInitialize;
end;
 

Результат  

Цитата:
Project 1.exe raised exception class EAccessViolation with message 'Access violation at address 7C918FEA in module 'ntdll.dll'. Write of address 00000010'.

 
wader
А смысл Thread при этом не теряется разве ?
Так у меня ф1 и ф2 создавались для нового потока (о чем и говорит ошибка). А как для вызова нажатия клавиши ? Да и не пойдет это. Я же писал ф2 надо вызывать с параметрами (и разными)  через ф1, которая их и высчитывает...

Всего записей: 750 | Зарегистр. 03-10-2001 | Отправлено: 17:48 27-09-2006
Shweper



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Спасибо, вроде понял почему. А TPanel мне не пойдет, она непрозрачная, а я пытаюсь на флешку положить  PNG с поддержкой прозрачности... Главное теперь вижу куда искать
 
Добавлено:
Вообще видимо проще всего будет найти Дельфи6..

Всего записей: 416 | Зарегистр. 15-08-2005 | Отправлено: 17:51 27-09-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Hazard

Цитата:
А смысл Thread при этом не теряется разве ?  

А ты прочитай в справке (да и мастер создания потока пишет в юнит) про обращение к объектам VCL из других потоков - непотокозащищенное она, VCL эта.
Кстати, этим и AccessViolation может быть спровоцирован

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 19:20 27-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hazard
Не надо работать с VCL компонентами из разных потоков!!!
 
Если не хочешь синхронности через Synchronize, работай через передачу сообщений, будет все работать отлично и асинхронно! проверенно.

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 19:28 27-09-2006
Dmitry

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hazard
Извиняюсь. Не совсем понял начальный вопрос. Я так понял что проблема была в инициализации COM в отдельном потоке. Его действительно нужно инитить в каждом потоке отдельно. Но судя по сообщению об ошибке в следующем посте, проблема не в этом. Я бы постарался найти причину AV, прежде чем делать дальнейшие выводы. При трассировке, когда именно AV вываливается?
 
wader
Работать с VCL компонентами из разных потоков вполне возможно, нужно только аккуратно синхронизировать эти потоки с основной очередью сообщений. Либо через Synchronize, либо напрямую через оконные сообщения.

Всего записей: 81 | Зарегистр. 24-09-2003 | Отправлено: 22:07 27-09-2006 | Исправлено: Dmitry, 22:09 27-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dmitry
Так именно это я и сказал
 
Либо Synchronize, синхронизация (Кстати тоже через сообщения сделана )
Либо асинхронно через сообщения.
Оба эти метода не прямые. Доступ происходит в главном потоке.
 
А прямой метод - это непосредственно в дочернем потоке вызвать метод VCL компонента - ничего хорошего из этого не выйдет.

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 23:26 27-09-2006
Hazard



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да Synchronize я пользуюсь - таймером управляю. Только это не совсем то. У меня еще и переменные глобальные есть, все синхронизировать - тяжко. Получается легче все в поток перенести или вообще логику программы менять. Вообще каковы принципы разработки многоэтапного процесса ? Ну напр. работа с бд или интернетом с возможностью прерывания любого процесс пользователем ? Если использовать большие циклы, то кроме как thread вроде ничего не пойдет - операционка будет считать приложение "зависшим", да и все контролы будут заморожены ... Или варианты все же есть ?

Всего записей: 750 | Зарегистр. 03-10-2001 | Отправлено: 23:59 27-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hazard
А чем сообщения не устраивают?

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 02:25 28-09-2006
Dmitry

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hazard
Можно в длительном цикле периодически вызывать Application.ProcessMessages(). Тогда приложение будет нормально реагировать на действия пользователя и можно будет прерывать выполнение цикла допустим по нажатию кнопки и т.п.

Всего записей: 81 | Зарегистр. 24-09-2003 | Отправлено: 06:50 28-09-2006 | Исправлено: Dmitry, 06:51 28-09-2006
yuish

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xitsmex
Спасибо. буду пытать

Всего записей: 218 | Зарегистр. 10-02-2003 | Отправлено: 10:35 28-09-2006
Hazard



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wader
Дык Synchronize хорош для обновления пары - тройки объектов, а не работы с кучей глобальных переменных. И мне он по идеологии видимо не сильно подходит.
Dmitry
Вот спасибо, так спасибо ! Уважил ! Как же я сам про ProcessMessages забыл, хотя сам ведь сам в коде отрисовки WebBrowser использовал. ОГРОМНОЕ СПАСИБО !

Всего записей: 750 | Зарегистр. 03-10-2001 | Отправлено: 20:21 28-09-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Hazard

Цитата:
Дык Synchronize хорош для обновления пары - тройки объектов, а не работы с кучей глобальных переменных. И мне он по идеологии видимо не сильно подходит.  

Syncronize дает возможность выполнить что-то в контекте основного потока - преимущественно это нужно для работы с объектами из VCL, для глобальных переменных есть набор специальных средств синхронизации потоков (семафоры, крит. секции и т.д.)
А ProcessMessages при достаточно долгой итерации цикла тоже не сильно помогает

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 08:06 29-09-2006
ArtemiyUO

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hazard
А не статистику времени загрузки веб страниц вы случаем пишите?)

Всего записей: 539 | Зарегистр. 12-12-2005 | Отправлено: 08:31 29-09-2006
Hazard



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Полностью согласен, но видимо я еще не достиг "достаточно долгой итерации цикла" т.к. ProcessMessages реально помог, да же на слабой машинке. Хотя надо будет присмотреться и к твоему предложению. Что ты подразумевал под т.д. или семафоры (CreateMutex, OpenMutex, Pipe)  рулитят ? Если есть опыт работы с ними - поделись
 
ArtemiyUO
Скорее обработку контекста Статистику вроде можно просто снять -  типа так, напр.

Цитата:
 //сохраняем время
    WB.Navigate('что то там такое типа адреса');
  // Ожидаем создания документа и позволяем обрабатывать все сообщения
  while WB.Document = nil do Application.ProcessMessages;
  //Смотрим скока прошло ..

или ты не об этом ?

Всего записей: 750 | Зарегистр. 03-10-2001 | Отправлено: 18:28 29-09-2006
   

Страницы: 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru