Autor Beitrag
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.10.04 15:13 
cbs hat folgendes geschrieben:
Zitat:
Wichtig ist, so lange die zugehörige Synchronize Methode aus dem Haupt-VCL-Thread ausgeführt wird, steht der
Thread. Um nun zu verhindern, dass es zu Performance-Einbußen kommt, sollten die Synchronisations methoden so
kurz wie möglich gehalten werden.


ist damit "nur" die reine Synchronize Methode gemeint oder auch die Methoden die die Synchronize Methode aufruft?

spich: wird der thread direkt nach dem beenden der Synchronize Methode weiter ausgeführt (also ist es dem thread quasi egal das
Der Trick an Synchronize ist, daß es zwar zum Thread-Objekt gehört, aber nicht im Thread-Kontext (welchen das Objekt eigentlich repräsentieren soll) läuft, sondern im Kontext des Hauptthreads. Der Name verrät schon einiges - die Methode sollte nur eingesetzt werden um zB VCL-Elemente (Fortschrittsanzeige) mit den Daten des Threads zu synchronisieren.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Sa 05.03.05 09:35 
@Luckie: Hut ab, das ist gut.

Aber hier ein kleiner Hinweis zum Thema IPC (Inter Process Communication):

Luckie hat folgendes geschrieben:

Auf der anderen Seite gibt es aber auch Ressourcen, die von den Prozessen geteilt werden
können. Da wären zum Beispiel dynamische Bibliotheken, die DLL's, zu nennen. Eine DLL
kann von mehreren Prozessen gleichzeitig genutzt werden. Dabei wird sie nur einmal geladen,
ihr Code aber in den Adressraum des Prozesses eingeblendet, welcher die DLL nutzt. Dies
kann man unter anderem zur Inter Process Communication nutzen. Dies hat aber des Weiteren
noch den Vorteil, dass gleicher Code nur einmal geschrieben werden muss und gleichzeitig
von mehreren Prozessen genutzt werden kann.


Das war mal so. Aber heute stimmt das nicht mehr!

In der Delphihilfe (D5) steht dazu:

(a) In einer DLL deklarierte globale Variablen können von Object-Pascal-Anwendungen nicht importiert werden.
(b) Eine DLL kann von mehreren Anwendungen gleichzeitig verwendet werden. Jede Anwendung verfügt aber in ihrem Verarbeitungsbereich über eine Kopie der DLL mit einem eigenen Satz globaler Variablen.
(c) Damit mehrere DLLs (oder mehrere Instanzen einer DLL) den Speicher gemeinsam nutzen können, müssen die DLLs Speicherzuordnungstabellen verwenden. Weitere Informationen zu diesem Thema finden Sie in der Dokumentation der Windows-API.

Zu (a): Das ist etwas ungeschickt formuliert, denn es ist ja durchaus möglich auf in einer DLL deklarierte globale Variablen zuzugreifen, wenn man selbst passende Funktionen dafür vorsieht.
(Siehe auch das Beispiel unten)

Zu (b): Das mit der eigenen Kopie ist das neue, denn früher existierte nur eine Instanz. Darum kann man eine DLL normalerweise nicht mehr für IPC verwenden.

Zu (c): Das weiß wohl kaum jemand, und deshalb werden die meisten, die IPC per DLL implementieren auf die Nase fallen!

Deshalb der Vorschlag, nimm das einfach raus, denn das gehört dort nicht unbedingt zum Thema.

Für alle, die das nachprüfen wollen, ist unten ein Beispiel. Die DLL hat eine globale Variable,
die beim Laden initialisiert wird. Wenn ein Programm die Get-Funktion aufruft, erhält sie den aktuellen Wert. Mit der Set-Funktion lässt sich der Wert in der DLL ändern.

Wenn nun zwei Instanzen des Test-Programms gleichzeitig laufen, und jeweils eigene Namen per Set eintragen, sieht jeder, wenn er in allen Instanzen noch die Getfunktion benutzt, dass die Werte nicht übereinstimmen. Jede Instanz hat ihre eigene Kopie der DLL. Deshalb ist es also Essig mit IPC.

1. DLL-Projektdatei
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
library DLL;

uses
  SysUtils,
  Classes,
  UnitDLL in 'UnitDLL.pas';

  exports
  GetMyGlobalName,
  SetMyGlobalName;

{$R *.RES}

begin
end.


2. DLL-Implementation
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
unit UnitDLL;

interface

function GetMyGlobalName: ShortString; stdcall;
procedure SetMyGlobalName(Value: ShortString); stdcall;

implementation

var
  dllMyGlobalName: ShortString;

function GetMyGlobalName: ShortString;
begin
  Result := dllMyGlobalName;
end;

procedure SetMyGlobalName(Value: ShortString);
begin
  dllMyGlobalName := Value;
end;

initialization
  dllMyGlobalName := 'Jungfrau';
end.


3. Testprogramm:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
unit UnitFormMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TFormMain = class(TForm)
    EditShowName: TEdit;
    LabelName: TLabel;
    LabelNewName: TLabel;
    EditNewName: TEdit;
    ButtonSetName: TButton;
    ButtonGetName: TButton;
    procedure ButtonGetNameClick(Sender: TObject);
    procedure ButtonSetNameClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormMain: TFormMain;

implementation

var
  cMyDLL: THandle;
  cGetNameProc: function: ShortSTring; stdcall;
  cSetNameProc: procedure (Name: ShortSTring); stdcall;

{$R *.DFM}

procedure TFormMain.ButtonGetNameClick(Sender: TObject);
begin
  EditShowName.Text := cGetNameProc;
end;

procedure TFormMain.ButtonSetNameClick(Sender: TObject);
begin
  cSetNameProc(EditNewName.Text);
  EditShowName.Text := cGetNameProc;
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  ButtonGetNameClick(nil);
end;

initialization
  cMyDLL := LoadLibrary('DLL.dll');
  @cGetNameProc := GetProcAddress(cMyDLL,'GetMyGlobalName');
  @cSetNameProc := GetProcAddress(cMyDLL,'SetMyGlobalName');

finalization
  cGetNameProc := nil;
  cSetNameProc := nil;
  if cMyDLL <> 0 then
    FreeLibrary(cMyDLL);
end.


4. Formular
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
object FormMain: TFormMain
  Left = 498
  Top = 332
  Width = 182
  Height = 171
  ActiveControl = EditNewName
  Caption = 'Test Global DLL-Name'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poDefaultPosOnly
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object LabelName: TLabel
    Left = 8
    Top = 8
    Width = 87
    Height = 13
    Caption = 'Global DLL-Name:'
  end
  object LabelNewName: TLabel
    Left = 8
    Top = 56
    Width = 63
    Height = 13
    Caption = '&Neuer Name:'
    FocusControl = EditNewName
  end
  object EditShowName: TEdit
    Left = 8
    Top = 24
    Width = 153
    Height = 21
    Color = clBtnFace
    ReadOnly = True
    TabOrder = 0
  end
  object EditNewName: TEdit
    Left = 8
    Top = 72
    Width = 153
    Height = 21
    TabOrder = 1
  end
  object ButtonSetName: TButton
    Left = 88
    Top = 104
    Width = 75
    Height = 25
    Caption = '&Set Name'
    TabOrder = 2
    OnClick = ButtonSetNameClick
  end
  object ButtonGetName: TButton
    Left = 8
    Top = 104
    Width = 75
    Height = 25
    Caption = '&Get Name'
    TabOrder = 3
    OnClick = ButtonGetNameClick
  end
end


5. Test-Projekt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
program Test;

uses
  Forms,
  UnitFormMain in 'UnitFormMain.pas' {FormMain};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TFormMain, FormMain);
  Application.Run;
end.


Zuletzt bearbeitet von wdbee am So 06.03.05 15:26, insgesamt 2-mal bearbeitet
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 10

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 05.03.05 10:11 
klar hat die dll immer ne ganz eigene kopie sonst würde ja auch nen API hook auf die kernel32.dll alles crashen ;>
das funktioniert nur bei win98 im speicherbereich > 0x80000000 unter NT kann man FileMapping benutzen

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
beha
Hält's aus hier
Beiträge: 1

WIN 2000, WIN XP
Delphi 5, Delphi 2006 Ent.
BeitragVerfasst: Fr 30.12.05 00:09 
Hallo,

ich wollte gerade den Thread-Tutorial herunterladen und habe mich hierzu soeben hier (Delphi-Library) registriert (und nach Erhalt der EMail aktiviert).

Anschließend habe ich mich im Support-Forum von Luckie (Michael) registriert, aber dennoch komme ich beim Klick auf obigen Link immer hierhin (und nicht weiter):

tutorials.luckie-online.de/user/index.php

Wo muss ich mich noch registrieren, damit ich mit einem entsprechenden Username/password weiterkomme und das Tutorial herunterladen kann ?

Vielen Dank für eine Antwort.
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Fr 30.12.05 16:04 
Hallo,

Luckie ist "umgezogen" auf michael-puff.de, deshalb findest du das Tutorial, das du suchst wohl eher hier:
michael-puff.de/diri...er/Delphi/Tutorials/

Werde den Link im ersten Posting entsprechend anpassen.

Gruß,
raziel

_________________
JSXGraph
Luckie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 11830
Erhaltene Danke: 162

Windows 7 Home
BDS2006
BeitragVerfasst: Mi 02.04.08 10:34 
Ein neue überarbeitet und erweiterte Version ist erschienen.

Neu sind die Kapitel
  • Der Stack eines Threads - neu in Version vom 2008-04-02
  • Threadpools - neu in Version vom 2008-04-02
  • Pseudo-Threads(Fibers) - neu in Version vom 2008-04-02


Download des Tutorials und zugehörigen Demos im ersten Beitrag.

_________________
Gruß Michael
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Fr 03.06.11 14:29 
Da das Tutorial wieder nicht geht, hier der neue Link:

www.michael-puff.de/...reads_mit_Delphi.pdf