Excellent, that worked. I put the threads->new (\&tick)->detach; line into my code, and it successfully ran the code in the background, while the rest of the service ran as it normally should do. What I need to do now, is to be able to modify the %akill hash within the main service, and when the timeout sub runs through the entire hash, check the newest values as well.
Thanks Dan "Beau E. Cox" <[EMAIL PROTECTED]> wrote in message [EMAIL PROTECTED]">news:[EMAIL PROTECTED]... > Hi dan - > > > -----Original Message----- > > From: dan [mailto:[EMAIL PROTECTED]] > > Sent: Saturday, February 01, 2003 3:47 PM > > To: [EMAIL PROTECTED] > > Subject: Re: Threads > > > > > > I tried that, but it's still doing as before. I'll give you a more fuller > > outline of what there is, and what I want it to do, maybe it may become > > clearer... > > I'm using a socket, and it loops in a sub. > > while (<SOCK>) { > > # etc.. > > } > > once the code has finished connecting to the server, it runs another sub, > > &ping, > > sub ping { > > # blah blah > > if ($initial) { > > $thr = threads->new(\&akilltimeout); > > threads->yield; > > $thr->detach; > > } > > } > > as you see, this executes the sub &akilltimeout, which needs to > > run all the > > time, which is, > > sub akilltimeout { > > while (1) { > > # checks run here > > sleep 1; > > } > > } > > Now, when the code receives data from the server, the akilltimeout sub > > executes, it sleeps for a second, then doesn't do anything else. When it > > receives some more data, it executes again, etc. Basically, that sub needs > > to be running, and the checks need to be made once every second, without > > affecting the listening on the socket, since I know sleep() makes > > the entire > > program wait. So i use threads to run this portion of code. But it isn't > > running every second. Is this more clearer? Is this actually possible? heh > > > > Many thanks once again for your help. > > > > Dan > > -snipped- > > I'm not sure if I am on track with the following - but > this works (try it please): > > #!/usr/bin/perl > use strict; > use warnings; > use threads; > use Socket qw(:all); > > threads->new (\&tick)->detach; > > socket (SERVER, AF_INET, SOCK_STREAM, getprotobyname ('tcp')); > setsockopt (SERVER, SOL_SOCKET, SO_REUSEADDR, 1); > my $my_addr = sockaddr_in (8223, INADDR_ANY); > bind (SERVER, $my_addr) or die "bind\n"; > listen (SERVER, SOMAXCONN) or die "listen\n"; > while (accept (CLIENT, SERVER)) { > while (<CLIENT>) { > print $_; > s/($CR|$LF)$//g; > last unless $_; > } > my $content = <<"*EOF*"; > <html><body> > <h1>Hello World</h1> > </body></html> > *EOF* > my $clen = length $content; > $content = <<"*EOF*" . $content; > HTTP/1.1 200 OK > Content-Type: text/html > Content-Length: $clen > > *EOF* > print CLIENT $content; > close CLIENT; > } > > sub tick > { > while (1) { > sleep 1; > print scalar localtime()."\n"; > } > } > > I have tested this on ActivePerl 5.8.0 (804) on Win2K and > Perl 5.8.0 on SuSE Linux 8.1. Now I realize that the > main wait in this simple server is on an 'accept' > (not a 'recv'), but ... > > To test, just start this script and point your browser to > 'http://127.0.0.1:8223/ . The 'tick' _should_ keep ticking. > > Please try this on your system, and let me know if it works. > I have been very pleased with 5.8 threads and really want > to know what the problem is. Also - can you let me know what > your configuration is (OS and Perl). > > Aloha => Beau; > > PS: If you are using the thread as a timeouter - you may want > to use 'select' instead. But let's get your thread going anyway! > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]