Последняя версия DataExpress 3 beta от 15 сентября 2020 года.

Изображение Скачать | Изображение Что нового?



Объявление:

Если вам понравилась программа и вы ее интенсивно используете - замолвите словечко о ней на вашем сайте (блоге, форуме, твитере, краской на подъезде, ютуб-канале и т.д.) с активной (по-возможности) ссылкой на сайт программы/форум. Тем самым вы можете внести небольшой вклад в seo-карму проекта в виде входящих ссылок.
Спасибо! Администрация :)


>> Обсудить <<

Ошибка б/н

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

Ошибка б/н

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

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

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

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 КБ) 1315 просмотров

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

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

Re: Ошибка б/н

Сообщение admin » 18 сен 2018, 13:44

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

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

Re: Ошибка б/н

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

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

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

Re: Ошибка б/н

Сообщение admin » 18 сен 2018, 16:55

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

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

Re: Ошибка б/н

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

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

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

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

Re: Ошибка б/н

Сообщение admin » 18 сен 2018, 18:47

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

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

Re: Ошибка б/н

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

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

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

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


Вернуться в «Баг или не баг?»