Последняя версия DataExpress 3 beta от 12 февраля 2020 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Песочница
ИзображениеИзображениеИзображение

Ошибка б/н

Если столкнулись с непонятным поведением программы, возникает ошибка, но нет уверенности, что дело именно в программе (возможно в скрипте).
Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 11 раз

Ошибка б/н

Сообщение Гocть » Вт сен 18, 2018 1:38 pm

Имеется некий код. Примерно вычислил источник ошибки, но не могу понять причину. Конструкция приблизительно такая:

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

external 'Sleep@kernel32 stdcall';

procedure SelfOnBeforePost(Sender: TObject);
var i:integer;
begin
  try
  // "Какое то" действие в цикле:
    for i:=0 to 10 do
      begin
        Sleep(200);
        debug(Self.Recid);
        Application.ProcessMessages;
        //debug(Self.Recid)
      end;
  except
  end;
end;

procedure Form_Create;
var s:string;
begin
  Self.OnBeforePost:=@SelfOnBeforePost;
end; 
Вызывает вот такое:
123.JPG
123.JPG (26.9 КБ) 916 просмотров

при попытке переместиться по записям после поста. И даже просто при нахождении на любой записи выводится: "проблематик кей валуев в ИД = 2"
Я туплю или это какой то баг? :?:
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 4698
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 23 раза
Поблагодарили: 191 раз

Re: Ошибка б/н

Сообщение admin » Вт сен 18, 2018 1:44 pm

Похоже на дублирование ID в таблице.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 11 раз

Re: Ошибка б/н

Сообщение Гocть » Вт сен 18, 2018 2:08 pm

Если этот скрипт вставить любую другую свежесозданную форму, то возникает то же самое.
Еще смущает появление в цикле вывода ID другой записи (в OnBeforePost). Подозреваю, что это происходит из за Application.ProcessMessages. То есть этот метод, упрятанный даже в какой нибудь другой процедуре внутри формы допускает разблокировку таблицы и соответственно смену ID Self'а. Если ход мыслей верный, возникает вопрос: есть ли какой нибудь способ избежать конфликта без отказа от Application.ProcessMessages ?
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 4698
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 23 раза
Поблагодарили: 191 раз

Re: Ошибка б/н

Сообщение admin » Вт сен 18, 2018 4:55 pm

Трудно что-то сказать, не видя код и не понимая его назначения.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 11 раз

Re: Ошибка б/н

Сообщение Гocть » Вт сен 18, 2018 5:38 pm

Попробую "на пальцах". :)
При сохранении записи нужно выполнить процедуру внутри которой http запрос. Он выполняется асинхронно и для отлова результата используется repeat цикл, внутри которого и находится Application.ProcessMessages. Если это дело запустить по нажатию кнопки, то все ОК: пошел запрос на сервер, ничего не зависает, форму можно подвигать. Как только это попадает в OnBeforePost, начинается "танец теней", описанный выше. Ну а если я убираю Application.ProcessMessages или например отказываюсь от него, выполняя синхронный запрос, то подобной проблемы не возникает, но само собой все виснет.
В первом посте я просто для приличия отбил от текущего бардака этот самый кусок кода, из за которого по моему мнению весь сыр бор. Если показанный пример не кривой и должен корректно отрабатывать, то возможно есть какой то баг. Если в нем заметно что то ненормальное или противоречащее логике программы, то тогда мне наверное нужно подсушить голову и искать другой способ :lol: .
Как то так.

P.S. Просто есть такое соображение, что из за Application.ProcessMessages событие OnBeforePost не успев отработать "пропускает вперед" другие.
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 4698
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 23 раза
Поблагодарили: 191 раз

Re: Ошибка б/н

Сообщение admin » Вт сен 18, 2018 6:47 pm

Я все равно мало что понял. Асинхронная работа в DataExpress нежелательна, т. к. может нарушить работу компонентов.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 11 раз

Re: Ошибка б/н

Сообщение Гocть » Вт сен 18, 2018 7:29 pm

admin писал(а):Асинхронная работа в DataExpress нежелательна

Ну, в принципе уже плавно подошел к этому. Буду думать.

P.S. Вот бы кто нибудь пример работы в отдельном потоке в PS подкинул. :geek:
Фрилансер. Разработка на заказ. Консультирование.