100%-е использование ЦП в Delphi

Как вы сказали «Любая помощь будет признательна» , я подумал, что хотел бы упомянуть, что вы можете просто конвертировать сырой файл YCbCr в PNG, TIFF, JPEG или любой другой файл формата с помощью ImageMagick [ 118], который устанавливается в большинстве дистрибутивов Linux и доступен для macOS и Windows.

Запустите терминал (или командную строку, если под Windows) и преобразуйте YCbCr image.raw в PNG с помощью:

magick -size 1920x1080 -depth 8  YCbCr:image.raw  result.png

Или, скажем, файла CCIR 601 YUV в формате NetPBM PPM :

magick -size 800x600 -depth 8 YUV:image.raw result.ppm
5
задан Davy Landman 4 February 2009 в 09:41
поделиться

6 ответов

Проблема, которую Вы имеете, состоит в том, потому что Вы получаете данные UDP в потоке GUI, но хотите обработать данные в другом потоке.

Настоящая проблема состоит в том что Ваша попытка использовать асинхронный компонент блокирующимся способом. Лучшее решение состояло бы в том, чтобы пользоваться реальным блокированием коммуникационная библиотека UDP, такая как синапс. Затем очень легко просто ожидать новых данных для получения в потоке.

Вы могли просто записать:

while not Terminated do
begin
  BytesRead := FSocker.RecvBufferEx(@(Buffer[0]), BufferSize, Timeout);
  if (BytesRead = 0) then
  begin
    // continue or exit if the receiving Failed
    case FSocket.LastError of
      0, WSAETIMEDOUT: Continue;
      WSAECONNRESET, WSAENETRESET,
        WSAENOTCONN, WSAECONNABORTED,
        WSAENETDOWN:
        begin
          CloseConnection;
          Exit;
        end;
    else
      CloseConnection;
      Exit;
    end;    
  end;
  // process the data in the buffer
end;
6
ответ дан 18 December 2019 в 14:52
поделиться

Я не являюсь близким с кодом Дельфи, но Вы выполняете механизм активного ожидания, который шлифует Ваш ЦП.

Представление сна или задержки с циклом только скрывает проблему. Я предлагаю использовать лучший метод для получения Ваших сообщений/событий. Много решений существуют, как шаблон наблюдателя-слушателя, или поток ожидает и уведомляет схемы.


Некоторые полезные ссылки в ответ на Ваш комментарий:
3
ответ дан 18 December 2019 в 14:52
поделиться

1 Вам нужна версия Инди, более новой, чем 9.0.0.18, я думаю. Более старые имеют останавливающие шоу ошибки многопоточного выполнения. Это включает все версии Инди, поставленной с Delphi до версии 7.

2 Смотрят на пример кода о том, как работать с Инди.

http://www.indyproject.org/demos/index.html

2
ответ дан 18 December 2019 в 14:52
поделиться

Существует ли версия GetMessage, который ожидает (блокирует поток), пока сообщение не прибывает?

1
ответ дан 18 December 2019 в 14:52
поделиться

Этот проект является очень большим проектом. Так обновление Инди является трудным для меня. Но если Вы уверенный проблема будет из-за старой версии Инди, то я обновлю ее.

Я посмотрел на все демонстрации Инди. Эти демонстрации очень просты. В моем проекте у меня есть очень быстрая передача данных. (Как оперативное устройство звукозаписи)

0
ответ дан 18 December 2019 в 14:52
поделиться

Я не знаю версии GetMassage. Но это объявило в Windows.pas как это

function GetMessage; external user32 name 'GetMessageA';
1
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: