Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

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

 
Константин   (2009-07-20 17:37) [0]

Есть приложение с формой, есть модуль, подключаемый к приложению. В модуле прописан код загрузки библиотеки порта 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);//вылет

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


 
clickmaker ©   (2009-07-20 17:57) [1]

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

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


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

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

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


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

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


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

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


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

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


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

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


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


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

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


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


> Константин   (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 12:33) [9]

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


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

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


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

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

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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2009.09.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
4-1216285879
Alex_C
2008-07-17 13:11
2009.09.20
Управление по COM порту нестандартного оборудования


1-1215345387
Kolan
2008-07-06 15:56
2009.09.20
Как сделать подчёркивание чёрточками?


2-1247762842
fics)
2009-07-16 20:47
2009.09.20
Отчет в *.RTF


3-1227136044
Petr V. Abramov
2008-11-20 02:07
2009.09.20
forall и bulk collect into


15-1248110797
Илья_
2009-07-20 21:26
2009.09.20
Это не реклама