Avatar billede skovjuul Nybegynder
21. juni 2007 - 12:48 Der 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.

På forhånd tak for hjælpen
Jesper
Avatar billede martinlind Nybegynder
21. juni 2007 - 15:18 #1
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 :(
Avatar billede skovjuul Nybegynder
21. juni 2007 - 18:21 #2
Det bliver jo meget spændende da den ene komponent jeg skal bruge tager en anden komponent som property. Men det må jeg jo lege lidt med.
Avatar billede skovjuul Nybegynder
23. juni 2007 - 17:50 #3
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.

På forhånd tak for hjælpen.
Jesper
Avatar billede martinlind Nybegynder
24. juni 2007 - 12:14 #4
Sync bruges kun når din tråd skal "snakke med dit hovedprg." ( opdatere VCL/Form )

En tråd kan fint kører for sig selv uden at det går udover dit hoved program, bare du overholder de regler der er :)

Du kan evt. sende messages fra din tråd til din hovedform, det kan godt lade sig gøre.
Avatar billede martinlind Nybegynder
24. juni 2007 - 12:14 #5
du kan kigge på WM_COPYDATA :)
Avatar billede skovjuul Nybegynder
24. juni 2007 - 14:58 #6
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester