OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 19 Сентябрь, 2019 03:10

Часовой пояс: UTC + 3 часа




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

Зарегистрирован: Понедельник, 14 Май, 2012 18:19
Сообщения: 1
Приветствую!

Я решаю вопрос о возможности или невозможности перехода с С++ на Компонентный Паскаль / 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 *указатель_на_музыку_в_озу
      не обращаемся т.к. он указывает неизвестно куда*/
    }
}


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: многопоточность
СообщениеДобавлено: Пятница, 18 Май, 2012 07:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9139
Откуда: Россия, Орёл
Асинхронность (не многопоточность) в КП/ББ реализуется через объекты Services.Action. Но для этого надо делить на отдельные части каждую активность.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: многопоточность
СообщениеДобавлено: Пятница, 18 Май, 2012 08:53 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
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).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: многопоточность
СообщениеДобавлено: Понедельник, 18 Июнь, 2012 17:17 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 148
Откуда: Питер
Кажнтся, в ББ автоматический сборщик мусора не многопоточный (кроме экспериментальной сборки Ильи Ермакова)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: многопоточность
СообщениеДобавлено: Понедельник, 18 Июнь, 2012 23:31 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8174
Откуда: Троицк, Москва
GameHunter писал(а):
Кажнтся, в ББ автоматический сборщик мусора не многопоточный (кроме экспериментальной сборки Ильи Ермакова)?
Да, и не надо сложностей на свою ... голову.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: многопоточность
СообщениеДобавлено: Понедельник, 18 Июнь, 2012 23:38 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 438
Откуда: Егорьевск
[url]http://ru.wikipedia.org/wiki/Событийно-ориентированное_программирование[/url]
[url]http://ru.wikipedia.org/wiki/Автоматное_программирование[/url]


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB