P
prameela
Hai All,
Iam using file transfer(IO ::Ftp) with progress bars
updation with threads.But it is showing cannot read memory error.Iam
giving my part of code here. please suggest me how to correct this.
sub on_btnAddToXfer_clicked
{
$statusbar->pop($context_id);
my $filename = get_selected_file;
my $model = $lstXferQ->get_model;
my $new_iter = $model->append;
$model->set($new_iter, 0 => $filename);
print "File is $filename\n";
my $data = get_story_data_from_widgets;
$fnames{$filename} = $data;
# Appending hash values to the transferring file
open(FD,">> $filename") or die "cannot open $filename: $!";
for my $key(keys %{$fnames{$filename}})
{
print FD $fnames{$filename}{$key};
#print $fnames{$filename}{$key};
}
close(FD);
my $name_idx = $cmbName->get_active;
if($name_idx != -1)
{
$statusbar->pop($context_id);
}
elsif($txtSlug->get_text ne '')
{
$statusbar->pop($context_id);
}
elsif($txtCategory->get_text ne '')
{
$statusbar->pop($context_id);
}
$thread = new threads(\&get_value,$filename) unless
(defined($thread));
}
sub split_file
{
my $filename = shift;
$totalfilesize = -s $filename;
print "File in split is : $filename\n $totalfilesize\n";
my ($name, $ext);
if ($filename =~ /(.*)\.(.*)$/)
{
$name = $1; $ext = $2;
}
# no of segments hardcoded to 5
my $file_size = -s $filename;
my ($segment_size, $rem);
$segment_size = $file_size / NSEGMENTS;
$rem = $file_size % NSEGMENTS;
open(FD,"< $filename") or die "cannot open $filename: $!";
binmode(FD);
my $buffer;
my @retval_filenames;
#Splitting the file into segments
for (my $i = 1; $i <=NSEGMENTS; $i++)
{
my $outfile = "$name-$i.$ext";
open (OUTFD, "> $outfile") or die "Failed to open $outfile:
$!";
binmode(OUTFD);
$segment_size += $rem if ($i == NSEGMENTS);
read(FD,$buffer, $segment_size);
print OUTFD $buffer;
close(OUTFD);
push @retval_filenames, $outfile;
}
close (FD);
return \@retval_filenames;
}
sub transfer_file
{
my $arrayref = shift;
my $filename = @$arrayref[0];
my $count = @$arrayref[1];
print "FILE IS : $filename\n";
my $file_size = -s $filename;
my $org_file;
#Taking only filename from the path
if($filename =~ /([A-Za-z0-9_-]*\.mpg)$/)
{
$org_file = $1;
}
open(FD,"$filename") or die "cannot open file: $!";
binmode(FD);
my $completed;
my
$ftp=IO::Ftp->new(">","//user:usr1234\@callista.ueltv.org/squick/$org_file",TYPE=>'i');
my $n;
my $buffer;
while($n = read(FD,$buffer,4*1024*1024))
{
$ftp->send($buffer);
$completed += $n;
print "C is $completed\n";
$finished += $n;
print "F is : $finished\n";
# % xferred
my $percent = $completed / $file_size;
$progressbar[$count]->set_fraction($percent);
#~ my $totalpercent = $finished / $totalfilesize;
#~ print "Total is $totalpercent\n";
#~ if($totalpercent <= 1)
#~ {
#~ $progressbar6->set_fraction($totalpercent);
#~ }
undef($buffer);
if($ftp_die == 1)
{
$ftp->close;
$ftp->delete($filename);
unlink($filename);
&clear_progressbars;
print "File deleted\n";
return;
}
}
if($finished == $totalfilesize )#or $finished != $totalfilesize)
{
sleep(1);
$finished = 0;
print "cleared\n";
&clear_progressbars;
}
close(FD);
# Deleting temporary files from the Directory
unlink($filename);
}
sub get_value
{
print "Monitoring...\n";
while(1)
{
next unless (defined($list));
my $iter = $list->get_iter_first;
my $filename = $list->get($iter, 0) if defined($iter);
if($is_filexfer ==1)
{
my $totalpercent = $finished / $totalfilesize;
print "Total is $totalpercent\n";
if($totalpercent > 1)
{
print "total exceeds one\n";
$totalpercent = 1;
}
if($totalpercent <= 1)
{
$progressbar6->set_fraction($totalpercent);
}
if($totalpercent >= 1)
{
$is_filexfer = 0 ;
sleep(1);
}
}
if($is_filexfer == 0)
{
next unless(defined($filename));
print"File name is : $filename\n";
print "Splitting file...\n";
my $filenames_ref = split_file($filename);
my @filenames = @$filenames_ref;
$count = 0;
$finished = 0;
foreach (@filenames)
{
print "Transferring $_ ...\n";
transfer_file_cb($_,$count);
$is_filexfer = 1 ;
$count++;
}
sleep(2);
$list->remove($iter) if defined($iter);
}
}
}
sub transfer_file_cb
{
my $thread = new threads(\&transfer_file,\@_);
push (@threads, $thread);
}
# wait for the children to finish...
foreach (@threads)
{
$_->join;
}
Iam using file transfer(IO ::Ftp) with progress bars
updation with threads.But it is showing cannot read memory error.Iam
giving my part of code here. please suggest me how to correct this.
sub on_btnAddToXfer_clicked
{
$statusbar->pop($context_id);
my $filename = get_selected_file;
my $model = $lstXferQ->get_model;
my $new_iter = $model->append;
$model->set($new_iter, 0 => $filename);
print "File is $filename\n";
my $data = get_story_data_from_widgets;
$fnames{$filename} = $data;
# Appending hash values to the transferring file
open(FD,">> $filename") or die "cannot open $filename: $!";
for my $key(keys %{$fnames{$filename}})
{
print FD $fnames{$filename}{$key};
#print $fnames{$filename}{$key};
}
close(FD);
my $name_idx = $cmbName->get_active;
if($name_idx != -1)
{
$statusbar->pop($context_id);
}
elsif($txtSlug->get_text ne '')
{
$statusbar->pop($context_id);
}
elsif($txtCategory->get_text ne '')
{
$statusbar->pop($context_id);
}
$thread = new threads(\&get_value,$filename) unless
(defined($thread));
}
sub split_file
{
my $filename = shift;
$totalfilesize = -s $filename;
print "File in split is : $filename\n $totalfilesize\n";
my ($name, $ext);
if ($filename =~ /(.*)\.(.*)$/)
{
$name = $1; $ext = $2;
}
# no of segments hardcoded to 5
my $file_size = -s $filename;
my ($segment_size, $rem);
$segment_size = $file_size / NSEGMENTS;
$rem = $file_size % NSEGMENTS;
open(FD,"< $filename") or die "cannot open $filename: $!";
binmode(FD);
my $buffer;
my @retval_filenames;
#Splitting the file into segments
for (my $i = 1; $i <=NSEGMENTS; $i++)
{
my $outfile = "$name-$i.$ext";
open (OUTFD, "> $outfile") or die "Failed to open $outfile:
$!";
binmode(OUTFD);
$segment_size += $rem if ($i == NSEGMENTS);
read(FD,$buffer, $segment_size);
print OUTFD $buffer;
close(OUTFD);
push @retval_filenames, $outfile;
}
close (FD);
return \@retval_filenames;
}
sub transfer_file
{
my $arrayref = shift;
my $filename = @$arrayref[0];
my $count = @$arrayref[1];
print "FILE IS : $filename\n";
my $file_size = -s $filename;
my $org_file;
#Taking only filename from the path
if($filename =~ /([A-Za-z0-9_-]*\.mpg)$/)
{
$org_file = $1;
}
open(FD,"$filename") or die "cannot open file: $!";
binmode(FD);
my $completed;
my
$ftp=IO::Ftp->new(">","//user:usr1234\@callista.ueltv.org/squick/$org_file",TYPE=>'i');
my $n;
my $buffer;
while($n = read(FD,$buffer,4*1024*1024))
{
$ftp->send($buffer);
$completed += $n;
print "C is $completed\n";
$finished += $n;
print "F is : $finished\n";
# % xferred
my $percent = $completed / $file_size;
$progressbar[$count]->set_fraction($percent);
#~ my $totalpercent = $finished / $totalfilesize;
#~ print "Total is $totalpercent\n";
#~ if($totalpercent <= 1)
#~ {
#~ $progressbar6->set_fraction($totalpercent);
#~ }
undef($buffer);
if($ftp_die == 1)
{
$ftp->close;
$ftp->delete($filename);
unlink($filename);
&clear_progressbars;
print "File deleted\n";
return;
}
}
if($finished == $totalfilesize )#or $finished != $totalfilesize)
{
sleep(1);
$finished = 0;
print "cleared\n";
&clear_progressbars;
}
close(FD);
# Deleting temporary files from the Directory
unlink($filename);
}
sub get_value
{
print "Monitoring...\n";
while(1)
{
next unless (defined($list));
my $iter = $list->get_iter_first;
my $filename = $list->get($iter, 0) if defined($iter);
if($is_filexfer ==1)
{
my $totalpercent = $finished / $totalfilesize;
print "Total is $totalpercent\n";
if($totalpercent > 1)
{
print "total exceeds one\n";
$totalpercent = 1;
}
if($totalpercent <= 1)
{
$progressbar6->set_fraction($totalpercent);
}
if($totalpercent >= 1)
{
$is_filexfer = 0 ;
sleep(1);
}
}
if($is_filexfer == 0)
{
next unless(defined($filename));
print"File name is : $filename\n";
print "Splitting file...\n";
my $filenames_ref = split_file($filename);
my @filenames = @$filenames_ref;
$count = 0;
$finished = 0;
foreach (@filenames)
{
print "Transferring $_ ...\n";
transfer_file_cb($_,$count);
$is_filexfer = 1 ;
$count++;
}
sleep(2);
$list->remove($iter) if defined($iter);
}
}
}
sub transfer_file_cb
{
my $thread = new threads(\&transfer_file,\@_);
push (@threads, $thread);
}
# wait for the children to finish...
foreach (@threads)
{
$_->join;
}