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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование потока 
V
    Опции темы
MetalFan
Дата 22.1.2012, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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

Добавлено через 13 минут и 17 секунд
Мда. ну во первых, при передаче строк в/из библиотеки первым модулем в проектах приложения и библиотеки должен быть упомянут ShareMem.
Во-вторых... что-то я про потоки вообще не понял...  card_info в библиотеке запускает поток и не дожидаясь окончания его работы выходит, возвращая "пустой" по сути результат...
Поток, отработав, записывает результат в ГЛОБАЛЬНУЮ переменную, второй вызов (нажатие кнопки) запускает поток еще раз и по сути возвращает результат работы первого потока.
На мой взгляд все написано очень криво с кучей недочетов... но для начала разбирания работы с потоками сойдет. Твори дальше)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MrDmitry
Дата 24.1.2012, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

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



а разве у меня в dll ShareMem не указан 1? И почему он должен быть первым? Вить компилятор не ругается не настадии компиляции не в процессе работы уже скомпилированного приложения?

ну и самое главное.  

А как заставить card_info ожидать завершение потока а патом выходить?
PM MAIL   Вверх
MetalFan
Дата 24.1.2012, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



MrDmitry, если ты не читаешь, что тебе пишет САМА делфя в комментарии при создании новой библиотеки, то это твои проблемы.
Цитата

 Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's
 (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters.


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

Это сообщение отредактировал(а) MetalFan - 24.1.2012, 11:37


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MrDmitry
Дата 24.1.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

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



Цитата(MetalFan @ 24.1.2012,  11:35)
MrDmitry, если ты не читаешь, что тебе пишет САМА делфя в комментарии при создании новой библиотеки, то это твои проблемы.
Цитата

 Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's
 (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters.


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

C sharemem я понял. В самой dll у меня она на 1 строчке uses а в приложении забыл (( Но вот с потоком вы отвечаете для меня не понятно. Вернее я понял что у меня функция не правильно работает с потоком. 

Она вызывает поток, заносит данные в глобальную переменную, но не дожидаясь окончания работы завершается. Это я понял еще на 1 странице этой темы, а вы подтверждаете мои догадки. Но смысл этой темы в том что я не знаю как решить эту проблему, ибо моих знаний в работе с потоком и вообще в delphi не достаточно. Я не прошу сделать какую то работу за меня. Или написать какой то код. Мне бы хотелось, если это вас не обременит, чтоб вы более подробно написали что делать? А именно как заставить функцию ждать завершения потока

PS

Сейчас в голову пришла мысль сделать примерно так

Код

//Информация по выбранной карте
function card_info(http, action, key, cardid:string):mytype; stdcall; export;
var
  NewThread: cards_info;
begin
  result.balance:='';
  Result.name:='';
  Result.surname:='';
  Result.pat:='';
  Result.bonus:='';
  Result.last:='';
  Result.reg:='';
  Result.birth:='';
  Result.succes:='';
  Result.test:='';
  NewThread := cards_info.Create(True);
  NewThread.FreeOnTerminate := True;
  try
    NewThread.http_thread := http;
    NewThread.action_thread := action;
    NewThread.key_thread := key;
    NewThread.cardid_thread := cardid;
    NewThread.Priority:=tpNormal;
    NewThread.Start;
    while res.succes='' do
     begin

     end;
    result:=res;
  except on EConvertError do
    begin
      NewThread.Free;
      result.succes:='0';
    end;
  end;


Все срабатывает как надо ) Но наверное такой вариант не эстетичен


Это сообщение отредактировал(а) MrDmitry - 24.1.2012, 14:38
PM MAIL   Вверх
MetalFan
Дата 24.1.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



MrDmitry, я просто не понимаю, зачем нужно выполнение кода в отдельном потоке, если не обеспечивается параллельная работа вызывающего потока.
Дождаться окончания работы потока можно с помощью TThread.WaitFor


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MrDmitry
Дата 24.1.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

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



Ну это всего лишь макет. В будующем будет так. Пользователь запрашивает информацию по выбранной карте. Интернет может быть разный, чтоб вся программа не "подвисала" в момент пока ждет ответа код выполняется в потоке, при этом в label пока не будет получен ответ будет выводится сообщение, "Запрос отправлен, пожалуйста подождите." Все остальные кнопки до получения данных будут блокироваться. В этом же разделе я задавал другой вопрос. Как все выше задуманное осуществить? И мне посоветовали использовать потоки. Вот я их и использую. Возможно не рационально и не правильно, но еще раз повторяюсь, раньше не пользовался потоками. Это мой первый опыт. 


PS тот код который я написал скорее всего с изьяном. Веть если будет какой то сбой, например php который мне выдает данные с сервера будет по какой то причине не доступен. то в res.sucess у нас не за несется данных и значит цикл будет бесконечным (

при TThread.WaitFor программа зависает намертво (

Это сообщение отредактировал(а) MrDmitry - 24.1.2012, 18:35
PM MAIL   Вверх
MetalFan
Дата 25.1.2012, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(MrDmitry @  24.1.2012,  18:13 Найти цитируемый пост)
значит цикл будет бесконечным

учесть это и тогда не будет
Цитата(MrDmitry @  24.1.2012,  18:13 Найти цитируемый пост)
при TThread.WaitFor программа зависает намертво (

WaitFor ждет окончания работы потока (читай - завершения работы Execute).


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MrDmitry
Дата 25.1.2012, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

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



И можно последний вопрос? А как бы вы реализовали то что мне нужно было? Не прошу код. На словах )
PM MAIL   Вверх
MetalFan
Дата 26.1.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 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...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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