Avatar billede r.hegaard Nybegynder
09. juni 2004 - 15:20 Der er 24 kommentarer og
2 løsninger

procedure afvikling

Jeg har følgende procedure:

procedure TForm1.Button1Click(Sender: TObject);
begin
  p1;
  ShowMessage('Test');
end;

hvor p1 er en procedure.
Vil beskeden så først blive vist, når p1 er færdig afviklet, eller vil det bliver lige så snart, at p1 er startet ??

Hvad vil løsningen være, hvis man skulle lave det på begge måder ??
Avatar billede dkn Nybegynder
09. juni 2004 - 15:26 #1
så snart p1 er started. Hvis du skal have den til vente skal du lave en function
Avatar billede kammeyer Nybegynder
09. juni 2004 - 15:31 #2
> dkn  -  den er jeg ikke enig med dig i.
Den afvikles sekventielt og ikke parallelt. Men du kan få den til at køre sådan ved at lave p1 om til en selvstændig tråd.
function / procedure - samme ting ...... (i den henseende)
Avatar billede arne_v Ekspert
09. juni 2004 - 15:32 #3
Øh ?

Jeg vil stærkt formode at besked først bliver vist når p1 er afsluttet !
Avatar billede snowball Novice
09. juni 2004 - 15:33 #4
Jeg vil også sige at beskeden først bliver vist når p1 er afsluttet.

Men det kan man jo nemt teste ved at man i slutningen af p1 proceduren indsætter en ShowMessage('P1 afsluttet'); og så se hvilken besked der kommer først frem ;)
Avatar billede dkn Nybegynder
09. juni 2004 - 15:36 #5
det kommer jo også an på hvad procedure skal udføre vil jeg sige.
Desuden ved jeg ikke hvordan MP og HT systemer vil gøre det
Avatar billede arne_v Ekspert
09. juni 2004 - 15:38 #6
Jeg mener ikke at det overhovedet afhænger af hvad p1 gør. P1 vil afslutte
førend næste udføres (og selvom p1 evt. starter en tråd så afslutter p1 alligevel).

Og singletrådede apps opfører sig helt ens på single processor og multi processor
systemer.
Avatar billede dkn Nybegynder
09. juni 2004 - 15:47 #7
jaa min fejl, overtræt tror jeg :)

Der er sku gået lidt for meget objects og mutithreaded kode i det på det sidste :D
Avatar billede kammeyer Nybegynder
09. juni 2004 - 19:38 #8
haha - helt i orden, dkn. Men jeg må indrømme at du fik mig rystet mig lidt .... :)
Avatar billede r.hegaard Nybegynder
09. juni 2004 - 19:57 #9
Er konklusionen så, at p1 under alle omstændigheder vil blive afviklet før beskeden bliver vist ??
Hvad skal man så gøre, hvis man gerne vil have, at p1 bare bliver startet og beskeden derefter bliver vist ??
Avatar billede arne_v Ekspert
09. juni 2004 - 20:01 #10
Ja

Du skal ikke kalde p1 men i.s.f. starte en tråd som kører p1.
Avatar billede r.hegaard Nybegynder
09. juni 2004 - 20:04 #11
Hvordan gør man det ??
Avatar billede arne_v Ekspert
09. juni 2004 - 20:13 #12
Det ligger uden for mit erfarings område.

Men der må være noget på nettet.

Google fandt bl.a. følgende:
  http://www.delphicorner.f9.co.uk/articles/op2.htm
Avatar billede arne_v Ekspert
09. juni 2004 - 20:15 #13
Avatar billede r.hegaard Nybegynder
09. juni 2004 - 20:21 #14
Den første adresse virker ikke og den anden virker lidt uoverskuelig.
Er der nogle som har forstand på det, som kan forklare det ??
Avatar billede arne_v Ekspert
09. juni 2004 - 20:28 #15
Jeg kan godt prøve at se om jeg kan få hello world til at virke trådet.
Avatar billede r.hegaard Nybegynder
09. juni 2004 - 20:32 #16
Hvad mener du med det ??
Avatar billede arne_v Ekspert
09. juni 2004 - 20:33 #17
At jeg vil prøve at få et simpelt eksempel med TThread til at virke.
Avatar billede r.hegaard Nybegynder
09. juni 2004 - 20:36 #18
OK. Det lyder godt...
Avatar billede arne_v Ekspert
09. juni 2004 - 20:47 #19
procedure p1;

begin
    ShowMessage('p1');
    Sleep(1000);
    ShowMessage('p1');
end;


type
  RunP1 = class(TThread)
      protected
        procedure Execute; override;
      end;


procedure RunP1.Execute;

begin
  p1;
end;


  t := RunP1.Create(false);
  ShowMessage('test');
  t.WaitFor;
Avatar billede arne_v Ekspert
09. juni 2004 - 20:47 #20
udskriver:
  p1
  test
  p1
som den skal.
Avatar billede arne_v Ekspert
09. juni 2004 - 20:48 #21
Du kan også godt se den komplette kode men jeg laver normalt console applikationer !

program thr;

{$APPTYPE CONSOLE}

uses
  Classes,Dialogs,Windows;

type
  RunP1 = class(TThread)
      protected
        procedure Execute; override;
      end;

procedure p1;

begin
    ShowMessage('p1');
    Sleep(1000);
    ShowMessage('p1');
end;

procedure RunP1.Execute;

begin
  p1;
end;

var
  t : RunP1;

begin
  t := RunP1.Create(false);
  ShowMessage('test');
  t.WaitFor;
end.
Avatar billede insaneboy Nybegynder
10. juni 2004 - 14:35 #22
TThread kan nogle gange være lidt overkill til små opgaver. Du KAN også bruge en createthread()-API.

function MinThread( parameter : pointer ): LongInt; stdcall;
begin
  DoSomething1();
  DoSomething2();
  Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThrID : DWord;
begin
  Createthread( nil, 0, @MinThread, nil, 0, ThrID );
  ShowMessage('Test');
end;

Men brug hvad du har lyst til :)
Avatar billede eht Nybegynder
10. juni 2004 - 23:28 #23
En helt enkel metode (og måske lidt primitiv), er at sætte "P1" koden ind i en OnTimer event.
Timeren er sat til interval = 1 og enabled = false;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
sleep(2000);
showmessage('Timer procedure slut');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled := true;
showmessage('Button1 procedure slut'); //udføres straks efter at timeren er startet
end;
Avatar billede arne_v Ekspert
01. juli 2004 - 21:59 #24
Tid at få afsluttet spørgsmålet ?
Avatar billede arne_v Ekspert
01. juli 2004 - 22:00 #25
Og et svar fra mig
Avatar billede r.hegaard Nybegynder
01. juli 2004 - 23:53 #26
Ja, det er vist ved at være tid at få afsluttet spørgsmålet.
Jeg venter lige og ser om der evt. er flere, som også vil af med et svar....
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