Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
Константин   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
15-1243963751
AlexDan
2009-06-02 21:29
2009.09.20
Ещё тут одна мечта идиота сбылась..


2-1247728376
Cobalt
2009-07-16 11:12
2009.09.20
Как сохранить число в трех однобайтовых.


8-1197293016
Klim
2007-12-10 16:23
2009.09.20
Работа с PNG


1-1216127848
IGray
2008-07-15 17:17
2009.09.20
Встроенный локализатор Delphi2007 - глюк с кириллицей!


15-1248125402
Юрий
2009-07-21 01:30
2009.09.20
С днем рождения ! 21 июля 2009 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский