![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема синхронизации. Подскажите.
Константин © (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);//вылет с оставом на этой строчке
что, даже без экцепшена?