OberonCore
https://forum.oberoncore.ru/

многопоточность
https://forum.oberoncore.ru/viewtopic.php?f=31&t=3966
Страница 1 из 1

Автор:  sk1981 [ Четверг, 17 Май, 2012 22:25 ]
Заголовок сообщения:  многопоточность

Приветствую!

Я решаю вопрос о возможности или невозможности перехода с С++ на Компонентный Паскаль / BlackBox. Я прочитал сообщение о языке, проделал кое-какие эксперименты и у меня возникли некоторые вопросы, в частности, - вопрос о многопоточности. Кажется её там нет. Если нет, тогда чем заменить?

В упрощенном виде, моя задача такая:

1. Программа воспроизводит музыкальный файл, предварительно полностью загрузив его в ОЗУ.
2. Во время воспроизведения я загружаю в программу следующий файл, также в ОЗУ. Во время загрузки воспроизведение первого файла НЕ ДОЛЖНО ПРЕРВАТЬСЯ.
3. Как только второй файл загрузился он играет одновременно с первым.

Если я пишу это на С++, то задача решается созданием двух потоков: для загрузки и для воспроизведения. Второй работает с наивысшим приоритетом.

Код:
CRITICAL_SECTION cs;
void *указатель_на_музыку_в_озу;

поток_загрузки()
{
   EnterCriticalSection(cs)

   free(указатель_на_музыку_в_озу);

   указатель_на_музыку_в_озу  = malloc();
   
   read_file_to_memory(указатель_на_музыку_в_озу, file);
   
   LeaveCriticalSection(cs);
}

поток_воспроизведения()
{
   if (TryEnterCriticalSection(cs))
   {
      play_music(указатель_на_музыку_в_озу);
     
      LeaveCriticalSection(cs);
   }
   else
   {
      /*если музыка сейчас загружается, то по указателю
      void *указатель_на_музыку_в_озу
      не обращаемся т.к. он указывает неизвестно куда*/
    }
}


Вопрос: такая задача разрешима на Компонентном Паскале?

Автор:  Илья Ермаков [ Пятница, 18 Май, 2012 07:54 ]
Заголовок сообщения:  Re: многопоточность

Асинхронность (не многопоточность) в КП/ББ реализуется через объекты Services.Action. Но для этого надо делить на отдельные части каждую активность.

Т.е. read_file_to_memory и play_music должны быть реализованы в неблокирующем стиле (begin_read_file_to_memory...). Кстати, Windows поддерживает асинхронное чтение файла. А DirectShow (если вы используете его) - асинхронное воспроизведение.

Автор:  Евгений Темиргалеев [ Пятница, 18 Май, 2012 08:53 ]
Заголовок сообщения:  Re: многопоточность

sk1981 писал(а):
...прочитал сообщение о языке... вопрос о многопоточности. Кажется её там нет... Если я пишу это на С++, то задача решается созданием двух потоков...
Код:
   EnterCriticalSection(cs) ... LeaveCriticalSection(cs) ... TryEnterCriticalSection(cs))...
Вопрос: такая задача разрешима на Компонентном Паскале?
Если я не ошибаюсь, в таком виде задача на КП разрешима ровно также как и на C++. Вы же используете библиотечные средства многопоточности, а не языковые.
Код:
DEFINITION WinApi ["KERNEL32.dll"];
...
PROCEDURE EnterCriticalSection (VAR [nil] lpCriticalSection: RTL_CRITICAL_SECTION);
...
PROCEDURE LeaveCriticalSection (VAR [nil] lpCriticalSection: RTL_CRITICAL_SECTION);
...
PROCEDURE TryEnterCriticalSection (VAR [nil] lpCriticalSection: RTL_CRITICAL_SECTION): BOOL;
...
END WinApi.
P.S. Вы же в win-ББ работали. Эта многопоточность в нём используется (поглядите Kernel.InstallKeyboardInt и Kernel.KeyboardWatcher).

Автор:  GameHunter [ Понедельник, 18 Июнь, 2012 17:17 ]
Заголовок сообщения:  Re: многопоточность

Кажнтся, в ББ автоматический сборщик мусора не многопоточный (кроме экспериментальной сборки Ильи Ермакова)?

Автор:  Info21 [ Понедельник, 18 Июнь, 2012 23:31 ]
Заголовок сообщения:  Re: многопоточность

GameHunter писал(а):
Кажнтся, в ББ автоматический сборщик мусора не многопоточный (кроме экспериментальной сборки Ильи Ермакова)?
Да, и не надо сложностей на свою ... голову.

Автор:  Alexander Shiryaev [ Понедельник, 18 Июнь, 2012 23:38 ]
Заголовок сообщения:  Re: многопоточность

[url]http://ru.wikipedia.org/wiki/Событийно-ориентированное_программирование[/url]
[url]http://ru.wikipedia.org/wiki/Автоматное_программирование[/url]

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/