![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
MrDmitry, хм, ну зря ты считаешь, что все тут только сидят и ждут, как бы кому-нибудь помочь.
Посмотрю на досуге приложеный проект. Добавлено через 13 минут и 17 секунд Мда. ну во первых, при передаче строк в/из библиотеки первым модулем в проектах приложения и библиотеки должен быть упомянут ShareMem. Во-вторых... что-то я про потоки вообще не понял... card_info в библиотеке запускает поток и не дожидаясь окончания его работы выходит, возвращая "пустой" по сути результат... Поток, отработав, записывает результат в ГЛОБАЛЬНУЮ переменную, второй вызов (нажатие кнопки) запускает поток еще раз и по сути возвращает результат работы первого потока. На мой взгляд все написано очень криво с кучей недочетов... но для начала разбирания работы с потоками сойдет. Твори дальше) -------------------- There are always someone smarter than you... |
|||
|
||||
MrDmitry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 556 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
а разве у меня в dll ShareMem не указан 1? И почему он должен быть первым? Вить компилятор не ругается не настадии компиляции не в процессе работы уже скомпилированного приложения?
ну и самое главное. А как заставить card_info ожидать завершение потока а патом выходить? |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
MrDmitry, если ты не читаешь, что тебе пишет САМА делфя в комментарии при создании новой библиотеки, то это твои проблемы.
А смысл делать операцию в потоке, если потом безусловно ждать (читай-замораживать вызывающий поток) окончания его выполнения. Это сообщение отредактировал(а) MetalFan - 24.1.2012, 11:37 -------------------- There are always someone smarter than you... |
|||
|
||||
MrDmitry |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 556 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
C sharemem я понял. В самой dll у меня она на 1 строчке uses а в приложении забыл (( Но вот с потоком вы отвечаете для меня не понятно. Вернее я понял что у меня функция не правильно работает с потоком. Она вызывает поток, заносит данные в глобальную переменную, но не дожидаясь окончания работы завершается. Это я понял еще на 1 странице этой темы, а вы подтверждаете мои догадки. Но смысл этой темы в том что я не знаю как решить эту проблему, ибо моих знаний в работе с потоком и вообще в delphi не достаточно. Я не прошу сделать какую то работу за меня. Или написать какой то код. Мне бы хотелось, если это вас не обременит, чтоб вы более подробно написали что делать? А именно как заставить функцию ждать завершения потока PS Сейчас в голову пришла мысль сделать примерно так
Все срабатывает как надо ) Но наверное такой вариант не эстетичен Это сообщение отредактировал(а) MrDmitry - 24.1.2012, 14:38 |
||||||
|
|||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
MrDmitry, я просто не понимаю, зачем нужно выполнение кода в отдельном потоке, если не обеспечивается параллельная работа вызывающего потока.
Дождаться окончания работы потока можно с помощью TThread.WaitFor -------------------- There are always someone smarter than you... |
|||
|
||||
MrDmitry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 556 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Ну это всего лишь макет. В будующем будет так. Пользователь запрашивает информацию по выбранной карте. Интернет может быть разный, чтоб вся программа не "подвисала" в момент пока ждет ответа код выполняется в потоке, при этом в label пока не будет получен ответ будет выводится сообщение, "Запрос отправлен, пожалуйста подождите." Все остальные кнопки до получения данных будут блокироваться. В этом же разделе я задавал другой вопрос. Как все выше задуманное осуществить? И мне посоветовали использовать потоки. Вот я их и использую. Возможно не рационально и не правильно, но еще раз повторяюсь, раньше не пользовался потоками. Это мой первый опыт.
PS тот код который я написал скорее всего с изьяном. Веть если будет какой то сбой, например php который мне выдает данные с сервера будет по какой то причине не доступен. то в res.sucess у нас не за несется данных и значит цикл будет бесконечным ( при TThread.WaitFor программа зависает намертво ( Это сообщение отредактировал(а) MrDmitry - 24.1.2012, 18:35 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
учесть это и тогда не будет WaitFor ждет окончания работы потока (читай - завершения работы Execute). -------------------- There are always someone smarter than you... |
|||
|
||||
MrDmitry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 556 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
И можно последний вопрос? А как бы вы реализовали то что мне нужно было? Не прошу код. На словах )
|
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
MrDmitry,
У тебя задача: узнать из одного потока (в твоем случае - главного), что отработал либо обработал данные второй поток, так? Тут на мой взгляд масса вариантов: 1. При вызове отдать указатель на функцию обратного вызова (callback), которую затем дергать по окончанию обработки данных в потоке. Синхронно или асинхронно с главным потоком. 2. При вызове отдать ссылку (хэндл, либо указатель на VCL обертку) объект синхронизации (Event?), состояние которого будет изменено по окнчанию работы доп.потока и отслеживать это состояние в первом потоке, к примеру, по таймеру. 3. Отправлять сообщение (Send/Post Message) окну в главном потоке по окончанию обработки 4. Подвариант 2го пункта. Создать пайп, отдать его доп.потоку, а затем ждать данные через него в осн.потоке. 5. ...много чего еще можно нафантазировать. -------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |