2015-06-30 2 views
0

Я создал сценарий Perl с двумя потоками:программы сотрудничества двух потоков

1) Создать .cfg файлов
2) Прочитайте эти .cfg файлов

Я хочу, чтобы выполнить это в то время как один поток заняты решения файлы, бок о бок мой второй поток будет читать эти файлы.

Bu У меня возникла проблема в тот момент, когда мой второй поток создан, он будет читать только файлы, созданные в этот момент. Может ли кто-нибудь дать представление о выполнении этой задачи.

Создание потоков и чтения файлов функции приведены ниже:

sub CreateThreads() { 
    $threads[0] = threads->create(\&CreateCFG); 
    sleep 3; 
    $threads[1] = threads->create(\&ReadCFG); 
} 

sub ReadCFG() { 

    my $id = threads->tid(); 

    opendir(DIR, $filedir) or die $!; 

    while (my $files = readdir(DIR)) { 
     if ($files eq "." || $files eq "..") { 
      next; 
     } 
     else { 
      my $filepath = $filedir . "/" . $files; 

      if ($files =~ m/$probename/) { 
       my @file = split("&", $files); 

       if ($file[3] !~~ @reportrobots) { 
        push(@reportrobots, $file[3]); 
        my $raddr = 
         "/" . $file[1] . "/" . $file[2] . "/" . $file[3]; 
        &ProbeReport(\$userdata_file, \$filepath, \$raddr); 
       } 

      } 
     } 

    } 
} 
+0

Почему бы не объединить обе нити в одну, которая будет иметь обе функции: сначала создать файл, а затем прочитать его? – ZygD

+0

Более подробная информация необходима для ответа на этот вопрос. Однако я подозреваю, что проблема заключается в том, что вы принимаете общие переменные, если это не так. – Sobrique

+0

Созданные файлы CFG Actuallly, которые создаются из источника, и содержимое этого файла записываются в файл. Я хочу, чтобы первый поток продолжал создавать файлы, так как будет много файлов для создания около 300-400, и я хочу, чтобы второй поток начинался через 2-3 секунды, и он должен начать чтение файлов. –

ответ

0

Я думаю, ваша проблема здесь будет то, что вы не перечитав каталог.

opendir(DIR, $filedir) or die $!; 
while (my $files = readdir(DIR)) { 

Потому что это не очевидно, что на самом деле происходит это время первый вы звоните readdir она считывает каталог, и последующие вызовы только перебирать этот список.

Это предотвратить странные вещи происходят, если - к примеру - я создаю файл в этот каталог в моего цикла.

Так что в действительности - ваша вторая нить только когда-либо смотрит на эту директорию. Это функционально аналогичен:

my @files = readdir(DIR); 
foreach my $file (@files) { 

Я хотел бы предложить, что вам нужно, это rewinddir функция. Или, возможно, используйте Thread::Queue или другой механизм для передачи файлов, нуждающихся в обработке.

Смежные вопросы