Форум: "Начинающим";
Текущий архив: 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