Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема синхронизации. Подскажите.


Константин ©   (2009-07-20 17:37:00) 

Есть приложение с формой, есть модуль, подключаемый к приложению. В модуле прописан код загрузки библиотеки порта GPIB и работы с ней. Если напрямую из приложения вызвать функцию инициализации порта, любое следующее действие (обновление ListBox, нажатие кнопки или просто изменение ее визибла) приводят к зависанию или вылету из программы. Например:
 msg :=  buffer;ListBox1.Items.Add(msg);ListBox1.Refresh;//этот кусок нормально вывоится
 InitGPIB;//загрузка библиотеки + опрос некоторый состояний порта
 buffer:='Что нибудь';
 ListBox1.Items.Add(buffer);//вылет с оставом на этой строчке

Без строчки InitGPIB программа работает нормально, без функций порта конечно. НО!!!!!! Если загрузку и обработку порта назначить отдельной кнопке на форме, все прекрасно работает! Т.е. если в начале запустить основной код, потом нажать кнопку, потом продолжить исполнение основного кода - ни каких проблем. Если же вызвать кнопку, на которую повешена библиотека - выбрасывает.

msg :=  'Проверка генератора...';ListBox1.Items.Add(msg);ListBox1.Refresh;
TestGeneratorClick(Sender);//сообщение кнопке
 bufferSt:='456twtr';
 ListBox1.Items.Add(bufferSt);//вылет

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


Сергей М.   (2009-07-21 14:01:00) [1]


> Юрий Зотов ©   (21.07.09 13:58) [11]


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


Юрий Зотов   (2009-07-21 13:58:00) [2]

> Константин   (21.07.09 12:33) [9]
> Хехей, потоки помогли.

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

Чутье, что ли?
:o)


Сергей М.   (2009-07-21 13:55:00) [3]

Соглашение о вызове какое использовал ?


Константин   (2009-07-21 12:33:00) [4]

Хехей, потоки помогли. Даже не потребовалась синхронизация. Видать библиотека и программа память не поделили и мешали друг другу. Вообще gpib-32.dll стандартная виндузовская библиотека, правда не во всех сборках виндовс она присутствует. Думаю, что основная проблема не в библиотеке, не могла же библиотека от операционки быть написана с существенными ошибками (корявое запускание - это помойму существенная ошибка)


Вариант   (2009-07-21 07:09:00) [5]


> Константин   (20.07.09 17:37)

Еcли есть возможность - надо отправить запрос к разработчику библиотеки с описанием ситуации, а пока идет ответ  я бы попробовал совет из [6] хотя бы из чувства спортивного интереса.

И у меня есть дополнительные  вопросы -
1) фраза
> если напрямую из приложения вызвать функцию инициализации
> порта
 - а есть другой вариант?
2) InitGPIB - это библиотечная функция из длл?
2.1) Как она объявляется в коде, что говорится об этом в докуметации?
2.2)  Есть ли документация?

3)
> Не помогает перенос кода из модуля запуска библиотеки
- об этом бы подробней. Что за код и из какого модуля?


> Константин   (21.07.09 00:09) [5]


> Наверно стоит попробовать с потоками.


Что дадут потоки? Просто заработало (еще вопрос) неизвестно почему и все... Так же у тебя уже работает
> И на каждую часть отвести кнопку и нажимать кнопки по очереди
> - все работает и проблем нет


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


Германн   (2009-07-21 01:25:00) [6]


> Игорь Шевченко ©   (21.07.09 00:11) [6]
>
> Application.processmessages вставить между "действиями в
> нажатии одной кнопки" не помогает ?
>

Думаю что не поможет.
Скорее ответ Юрий Зотов ©   (20.07.09 18:33) [2]
тут самый правильный.
Т.е.  процедура " InitGPIB" требует некоего времени. Но сама не предоставляет его.


Игорь Шевченко   (2009-07-21 00:11:00) [7]

Application.processmessages вставить между "действиями в нажатии одной кнопки" не помогает ?


Константин   (2009-07-21 00:09:00) [8]

Если код разбить на три части: начало, инициализация, продолжение. И на каждую часть отвести кнопку и нажимать кнопки по очереди - все работает и проблем нет. Но если попытаться "сложить" код в одну кнопку или сделать еще одну кнопку при нажатии на которую все три вызываются последовательно - вылетает с ошибкой памяти. Пробовал вызывать кнопки с задержкой в несколько десятков секунд - результат прежний, вылетает. Наверно стоит попробовать с потоками.


жж   (2009-07-20 18:48:00) [9]

Это скорее всего связано с тем, что в процедуре InitGPIB портится память.
Момент, когда такая ошибка проявится, достаточно случаен, и зависит от сборки


жж   (2009-07-20 18:48:00) [10]

Причем память может портить и сама библиотека


Юрий Зотов   (2009-07-20 18:33:00) [11]

Возможно, я не вполне понял проблему, но если понял, то можно попробовать вот что:

1. Загрузку и инициализацию библиотеки вынести в отдельный поток.
2. В TestGeneratorClick запускаем этот поток и ждем его завершения.
3. После этого библиотекой можно работать.


clickmaker   (2009-07-20 17:57:00) [12]

> ListBox1.Items.Add(buffer);//вылет с оставом на этой строчке

что, даже без экцепшена?


Наверх

Титульная страница Поиск, карта сайта Написать письмо