Страница 1 из 2

Чертовщина с параметром

Добавлено: 04 Декабрь 2019, 21:43
Игорь Столяров
Привет всем ! :)
Сейчас попробую описать то, чего не понимаю.

Среда: С11, у меня Win10, у клиента Win7.
Факты: Из Frame открывается MDI окно как поток и в него передаётся параметр Group как обычный String.
Всё было хорошо долгие лета, до того момент пока Size(Group) не вывалился за 1024 (сейчас 1055).

Дальше непонятно. У меня вообще проблем нет. Клиент эпизодически сообщает, что у него вываливается
ошибка связанная с тем, что параметр передаётся не полностью. Поставил на входе процедуры проверку
размера получаемого параметра - нет ошибок. Клиенту программу поставил - нет ошибок. Часа через два
он звонит и начинает рассказывать, что у него где-то 1 раз через 5 открытий окна появляется сообщение
"Ошибка параметра, размер 1024". Приезжаю, 20 раз открываю окно - нет ошибок, уезжаю - звонки повторяются … :(

Ничего не понимаю ! Что это вообще может быть такое ? :(
Может что-то извне влиять на размер стека приложения ?

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 10:57
kreator
Понятно, что в хелпе насчёт этого ничего. Поэкспериментируйте с размером стека. В хелпе - 35000. Я пользую значение по умолчанию (25000). Есть ещё возможность разбить на три "строки". Но наверняка дополнительные две уже заняты :) .

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 12:09
finsoftrz
Я передаю параметры между тредами через глобальную очередь. Она одна для всего. Работа с ней через специальные функции, в которых запись и чтение семафорятся. Сверху кодовые шаблоны. Передавать можно как обычные параметры, так и списковые. Есть еще аналогичный механизм для передачи параметров внутри треда, но он используется редко.

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 14:17
Yufil
kreator писал(а): 05 Декабрь 2019, 10:57 Понятно, что в хелпе насчёт этого ничего. Поэкспериментируйте с размером стека. В хелпе - 35000. Я пользую значение по умолчанию (25000). Есть ещё возможность разбить на три "строки". Но наверняка дополнительные две уже заняты :) .
Когда-то в прошлом тысячелетии обсуждалась похожая проблема.
Можно попробовать в качестве параметра передавать в строковом поле адрес группы ( Start( MyThread,25000,Address(MyGroup) & '') , а не саму группу, а уже внутри треда скопировать группу с указанным адресом в локальную переменную

Не помню, чем кончилось - OK или GPF

Код: Выделить всё

MyThread Procedure( String MyStartAddr ) 
! CopyMemory Procedure(Ulong Dest,Ulong Src,Ulong Size),Name('_memmove')
Myaddr         ULONG 
.... 
myAddr  = MyStartAddr 
.... 
СopyMemory(  address( LocalGroup ), MyAddr, Len( LocalGroup )) 
... 

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 17:08
vic7tar
Игорь Столяров писал(а): 04 Декабрь 2019, 21:43...появляется сообщение
"Ошибка параметра, размер 1024..."
А кто (или что) выдаёт такое сообщение?

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 17:16
kreator
vic7tar писал(а): 05 Декабрь 2019, 17:08
Игорь Столяров писал(а): 04 Декабрь 2019, 21:43...появляется сообщение
"Ошибка параметра, размер 1024..."
А кто (или что) выдаёт такое сообщение?
Разработчик, очевидно.

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 17:36
Игорь Столяров
kreator писал(а): 05 Декабрь 2019, 17:16А кто (или что) выдаёт такое сообщение?
Да, это моё отладочное сообщение если в процедуру попадает строка-параметр размером меньше, чем Size(MyGroup).
Кстати там ещё один прикол: если запускать под терминальным сервером, то проблема становиться прям настойчивой … ;)

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 18:40
vic7tar
kreator писал(а): 05 Декабрь 2019, 17:16Разработчик, очевидно.
А может такое быть, что разработчик в схеме преобразований группа->строка->группа допустил неточность?

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 19:12
Игорь Столяров
vic7tar писал(а): 05 Декабрь 2019, 18:40разработчик в схеме преобразований группа->строка->группа допустил неточность
Да нет там никаких преобразований.

Код: Выделить всё

! -- Вызов
Loc:MyGroup  Group(TypeGroup).
  Code
  ...
  Start(Browse_Bablo,25000,Loc:MyGroup)
  
!--- Получаем
Bablo Procedure(String xParam_)
Loc:MyGroup  Group(TypeGroup).
  Code
  Loc:MyGroup  = xParam_
  ...
Я бы сказал, что ситуация в какой-то момент начинает развиваться непредсказуемо и выходит из под контроля.
Напрямую я в память не лезу, здесь нет никаких манипуляций с адресами процедур и данных …
Непонятно, но я не сдаюсь. Треугольник будет выпит, будь он хоть параллелепипед ! :)

Чертовщина с параметром

Добавлено: 05 Декабрь 2019, 19:26
vic7tar
Определение TypeGroup можно посмотреть?

Чертовщина с параметром

Добавлено: 06 Декабрь 2019, 10:23
Amike34
Игорь Столяров писал(а): 05 Декабрь 2019, 19:12! -- Вызов
Loc:MyGroup Group(TypeGroup).
Code
...
Start(Browse_Bablo,25000,Loc:MyGroup)

!--- Получаем
Bablo Procedure(String xParam_)
Loc:MyGroup Group(TypeGroup).
Code
Loc:MyGroup = xParam_
...

Может быть попробовать:
Loc:MyGroup :=: xParam_

Чертовщина с параметром

Добавлено: 06 Декабрь 2019, 10:39
Игорь Столяров
Amike34 писал(а): 06 Декабрь 2019, 10:23Может быть попробовать:
Loc:MyGroup :=: xParam_
Спасибо, пробовал.
Но сожалению, уже на входе процедуры мерцает проблема Size(xParam_) <> Size(Loc:MyGroup).
И как следствие, присваиванием по полям проблему не решить.

Тут что-то напрямую связанное с названием темы. Вроде бы отловил один косяк - сейчас тестируется.
Если всё будет OK - непременно доложу о результате, и это будет неожиданный поворот событий. :)

Чертовщина с параметром

Добавлено: 06 Декабрь 2019, 10:42
Constantine
А если так?
Loc:MyGroup Group(TypeGroup),STATIC.

Чертовщина с параметром

Добавлено: 06 Декабрь 2019, 10:58
Игорь Столяров
Constantine писал(а): 06 Декабрь 2019, 10:42Loc:MyGroup Group(TypeGroup),STATIC.
Ну это уже танцы с бубном. :)
Так или иначе при вызове процедуры параметры записываются в стек, независимо от места объявления параметра.
И после вызова процедуры, что-то эпизодически сбивает этот процесс обмена данными.

Чертовщина с параметром

Добавлено: 06 Декабрь 2019, 11:13
Constantine
Ну, мое дело - предложить... :-)