21. juni 2007 - 12:48Der er
5 kommentarer og 1 løsning
Hjælp til tråd-forsøg
Hola
Jeg er ved at prøve kræfter med tråd-programmering og det er med tungen lige i munden så jeg håber der er nogle der kan hjælpe lidt :)
Idéen er at tråden skal stå og holde øje med en tabel. Når der kommer noget i tabellen skal den starte fra en ende af og sende en meddelse afsted.
Tråden er lavet via File->New->Thread Object.
procedure TfrmMain.FormCreate(Sender: TObject); begin QControl := MsgSender.Create(false); end;
procedure TfrmMain.ButtonClick(Sender: TObject); begin QControl.WaitFor; <-- Første problem QControl.Suspend; //select fra en database og indsæt ind i min køtabel. QControl.Resume; end;
procedure MsgSender.Execute; var queuenmb: integer; begin SetName; { Place thread code here } //repeat //select * from queue order by entrynmb asc limit 1 //if not eof then begin //if forespørgsel.msgtype = MAIL then begin //Syncronize(SendMail(mailsubject, msg, mail)); //update aftaler set issentmail = 2 where plannerkey and kundenavn //end //else if forespørgsel.msgtype = SMS then begin //Syncronize(SendSMS(mobilnummer, msg)); //update aftaler set issentsms = 2 where xxx //end //else //frmMain.mlog.add('Ukendt beskedtype! Afsending stoppet!'); //delete from queue where aftalenmb = queuenmb //end //else //sleep(60000); //sov 10 min. //until Terminated; end;
1) Som peget så er mit første problem at .WaitFor ikke kan bruges da MsgSender.Execute aldrig "udløber". Men jeg har heller ikke lyst at suspende min tråd midt i en gennemgang da der hurtigt kan komme rod i tabellerne. Hvordan fixes det?
2) Er sleep den korrekte måde at få en tråd til at vente med at gen-køre eller er der andre metoder?
3) Funktionerne SendMail og SendSMS har brug for at tilgå nogle komponenter (bla. Indy SMTP). Skal de bare placeres på hovedformen og kaldes med frmMain.component.whatever? Eller kan tråd-unit'en laves som en usynlig form hvorpå jeg skal lægge komponenterne?
Det er mange store spørgsmål i et emne, så derfor er der også mange point at dele ud af.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
dine to componenter IndyMail og SMS skal du create/erklære manuelt i din tråd, ellers løber du ind i sync. problemer, for din service "form" er ikke den samme tråd som din service og vcl'en er jo ikke tråd-sikker :(
Lige et par spørgsmål mere... Nu har jeg lavet min trådklasse og som det er nu kalder jeg den når jeg trykker på en knap.
1) Til hvad/hvornår bruges Syncronize rundt om en function? Når jeg bruger den synes bliver mit hovedprogram næsten umuligt at bruge?
2) Tråden suspenderer hvis jeg på min hovedform åbner en underform. f.eks. Edit->Opsætning. Kan den ikke blive ved med at kører lige meget hvad jeg laver i resten af programmet?
3) Hvordan kan jeg have en TMemo på min hovedform der bliver opdateret via tråden og samtidig ha' en underform åben(som ovenstående)? Tråden kan vel ikke opdatere en memo-box når hovedformen er "låst"?
Underformene bliver vist via ShowModal da det ikke skal være muligt at komme til hovedformen så længe en underform er åbnet.
Hmmm... tak for det martin, har du evt. et lille kode-eksempel hvordan WM_COPYDATA virker hvis jeg vil have log-data i min tråd i en TMemo på min hovedform?
Håber du bliver i tråden lidt endnu selvom pointene er delt ud :)
Hygge Jesper
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.