:: Visual Foxpro, Foxpro for DOS
Работа с терминалами учета рабочего времени Anviz
Victoriacom
Автор

Сообщений: 106
Дата регистрации: 08.12.2010
Здравствуйте, форумчане!
Не так давно общался с Вами по теме преобразования кода из C# в VFP9.
Мне тогда здорово помогли! Тогда я даже научился работать в отладчике Visual Studio 2017.
Тогда дело оказалось в типах данных. Непонятный мне тип Int[] оказался просто массивом байт, а не Integer.
Написал программу, работающую со всеми функциями SDK для прибора Fasepass 7. Всё отлично, все довольны.
НО.
Необходимо было написать программку, которая бы обращалась к устройству с периодичностью. Например, 20 секунд.
За эти 20 сек программа устанавливает связь с устройством, считывает с него необходимую инфу (список событий), удаляет прочитанную информацию и обрубает связь.
Всё как бы заработало. Проходит 10-15, иногда больше циклов обращений. События считываются.. И вдруг облом. Windows говорит, что работа программы Visual Foxpro 9 прекращена. Без объяснения причин.
При этом вводит прибор в такой ступор, что его приходится руками перезагружать.
Разработчикам SDK я уже написал. Два дня молчат.
Может у Вас есть какие-нибудь идеи? Что не устраивает Винду?
На компьютере у меня 8 гиг оперативной памяти. На диске пол-террабайта свободной памяти. Винда, ессно, 64 битная.



Исправлено 1 раз(а). Последнее : Victoriacom, 14.12.18 11:46
Ratings: 0 negative/0 positive
Re: Работа с терминалами учета рабочего времени Anviz
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
С памятью неаккуратно работаете, значит. Скорее всего, подали короткий кусок памяти под буфер для библиотеки.
Ratings: 0 negative/0 positive
Re: Работа с терминалами учета рабочего времени Anviz
Victoriacom
Автор

Сообщений: 106
Дата регистрации: 08.12.2010
До этого с памятью никогда не работал. Не было необходимости. Foxpro всё делал сам.
Правильно ли я делаю?

В начале моего класса, при установке соединения, создаю кучу:
hHeap = HeapCreate(0,0x01000,0)

Потом выделяю память из этой кучи:

nAddr = HeapAlloc(hHeap,1,nLen)

При разъединении коннекта (в Destroy'e класса) делаю:
nRetApi = HeapDestroy(hHeap)

Нужно ли мне использовать HeapAlloc при вызове каждой функции, и, соответственно, HeapFree - при выходе из функции.
А в Desroy'e класса вызывать HeapDestroy?



Исправлено 1 раз(а). Последнее : Victoriacom, 14.12.18 13:15
Ratings: 0 negative/0 positive
Re: Работа с терминалами учета рабочего времени Anviz
Victoriacom
Автор

Сообщений: 106
Дата регистрации: 08.12.2010
Я написал маленький модуль (EXE), который делает только функции соединения с устройством, опрашивает его на предмет событий, удаляет их и разъединяется.
В вызывающей программе у меня только

RUN имя_ проги

теперь генерируется другая ошибка

[attachment 30425 c++.jpg]

Меня напрягает следующая строка в сообщении:

File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line: 1322.

У меня нет на диске F: такого пути и такого файла!

Это сообщение держится несколько секунд, потом пропадает. И при следующем запуске мой экзешник уже отрабатывает нормально.



Исправлено 1 раз(а). Последнее : Victoriacom, 14.12.18 16:25
Ratings: 0 negative/0 positive
Re: Работа с терминалами учета рабочего времени Anviz
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В EXE-шнике (если открыть блокнотом или "фар"-ом) тоже нет этого имени, без пути?
Или не та библа, типа dbgheap, или путь dd, явно руть при разработке...
Или вирус
Ratings: 0 negative/0 positive
Re: Работа с терминалами учета рабочего времени Anviz
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
_CrtIsValidHeapPointer проверяет что указатель pUserData указывает на область памяти в куче общей для всех экземпляров С рантайм или в локальной куче в версиях до VS2010.

У вас неправильно инициализирован указатель на кучу.

f:\dd\vctools\crt_bld\self_x86\crt\src\ - путь к файлу dbgheap.c на машине разработчиков С рантайм.
Ratings: 0 negative/0 positive
Re: Работа с терминалами учета рабочего времени Anviz
Victoriacom
Автор

Сообщений: 106
Дата регистрации: 08.12.2010
Я изначально пошел по неверному пути Паниковского. Насмотрелся в отладчике Visual Studio на их код.
У них под каждый буфер обмена распределяется адресная память. Например,

tmp_ptr = Marshal.AllocHGlobal(send_len);
Marshal.FreeHGlobal(buffer);

Фокс делает это за меня.

Вместо кода:
nLen = LEN(cIpAddr) + 1
nAddr = 0
nAddr = HeapAlloc(hHeap,1,nLen)
cBuffer = SYS(2600, nAddr, nLen, cIpAddr + CHR(0))

написал:

cBuffer = cIpAddr
nRet = CCHex_ClientConnect(hHandle, @cBuffer, nPort)

и всё.
Фокс сам передает в функцию CCHex_ClientConnect указатель на память для cBuffer.

Ошибки ушли. НО. Моя программка сидит в памяти компьютера и по таймеру обрабатывает события. В момент обработки теряется фокус. Несмотря на то, что я закомментировал все WAIT WINDOW и WAIT CLEAR.

Т.е, сижу в редакторе, - бац! А курсора нет. И все нажатия на клавиши улетают в неизвестность.
Помогает мышка.



Исправлено 3 раз(а). Последнее : Victoriacom, 18.12.18 13:08
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика