Xpoint
   [напомнить пароль]

создание параллельного процесса

Метки: [без меток]
2008-11-13 12:02:22 [обр] s.s.[досье]

есть входной поток
open(PORT,"COM1") or die "Can't open COM1: $!"; while (<PORT>)
  {
    а вот после этого необходимо создать параллельный процесс для обработки полученных данных,
    передать дочернему процессу $_ и продолжить получать данные, вне зависимости от того завершился ли дочерний процесс или нет
  }

как это лучше сделать?

спустя 30 минут [обр] Thirteensmay(15/157)[досье]
сообщение промодерировано

perldoc threads
в первую очередь документацию по нему.

Или в чем конкретно проблема ?

спустя 15 минут [обр] s.s.[досье]

на com порту висит обработчик данных, поступающих от атс. данные нормально получаются, они сразу обрабатываются пишутся в файл. проблема в том, что при увеличении нагрузки часть данных, получаемых от атс теряется.
писать сначала необработанные данные в файл, а потом их разбирать можно, но хочется иметь какое-то подобие реалтайма.
вот мне
и хочется сделать так: пришла строка -> получили ее -> отдали ее на обработку, а сами продолжаем получать строки. для меня не страшно, что может возникнуть 100 или 200 процессов, которые заняты обработкой, важно чтобы поступающие данные не терялись

ps не знаю, поддерживает ли мой перл использование threads

спустя 13 минут [обр] Thirteensmay(15/157)[досье]

ну вот на threads такое элементарно и делается.

не знаю, поддерживает ли мой перл использование threads

Это вы о чем ? или незнаете как это проверить ??

спустя 10 минут [обр] Алексей Севрюков(198/1280)[досье]
s.s.[досье] Присутствует мнение что потоки Вам не помогут. Или Вы хотите сказать что если Вы данные вовремя из COM порта не заберете - они потеряются?
спустя 19 минут [обр] Thirteensmay(15/157)[досье]
Алексей Севрюков[досье] а говорите не телепат. Почему не помогут ? imho скорее всего из-за того что их вовремя не забирают они и теряются. Тут правда теоретически еще конкурентная запись в файл без блокировки может быть, а вы что имели ввиду ?
спустя 20 минут [обр] Алексей Севрюков(198/1280)[досье]
Thirteensmay[досье] Для начала полагаю что нужно проверить может ли "голый" (без обработки) процесс забирать данные без потерь. Если нет — то потоки тут не помогут и нужно решать задачу другими путями (читай, написать программу на С/С++, а не на Perl который для этого явно не подходит, либо курить ман по COM портам и смотреть что можно сделать на уровне железа, буфер увеличить, например).
спустя 23 минуты [обр] s.s.[досье]

извините, я на перле только учусь :-)

если я правильно понял, то если на PORT пришли данные (без задержки) например от A до Я, то они последовательно будут выведены на печать?


#c:/perl/bin/perl -w

use warnings;
use strict;
use DBI;
use threads;

sub start_thread
  {
   sleep(10);
   print $normal_string;
  }

my $normal_string = $_;
my $thread1;

open(PORT,"COM1") or die "Can't open COM1: $!";
while (<PORT>)
  {
   $normal_string = $_;
   $thread1 = $thread->create("start_thread","$normal_string");
  }

close(PORT);
exit;


спустя 1 час 7 минут [обр] Thirteensmay(15/157)[досье]

s.s.[досье] послушайте Алексей Севрюков[досье], убедитесь сначала что у вас забор из порта получается нормально, потестите и посмотрите как оно работает, а то тут много всяких моментов, одна буферизация чего стоит. Если там все нормально то прикрутить потоки совсем не сложно, обещаю помочь, в вашем примере в частности аргументы треду передаются, правильно, но внутри треда они должны считываться из умолчательного массива, а у вас что ?

Вот вам к примеру:

use threads ('yield', 'stack_size' => 64*4096);

sub start_thread
{
  threads->detach();
  
  my $input = @_[0];
  print "Thread input $input started\n";
  
  # Здесь обработка
  
  print "Thread input $input ended\n";
}

while (1)
{
  sleep(1);
  my $input = int(rand() * 100);

  my $thread = threads->create('start_thread', $input);
}
Powered by POEM™ Engine Copyright © 2002-2005