AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi DLL Tparallel.for loop deadock
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Tparallel.for loop deadock

Offene Frage von "Sequitar"
Ein Thema von Sequitar · begonnen am 16. Sep 2021 · letzter Beitrag vom 3. Nov 2021
Antwort Antwort
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#1

DLL Tparallel.for loop deadock

  Alt 16. Sep 2021, 22:10
Hallo,
ich möchte gerne eine simple tparallel loop laufen lassen

Beispiel:
Delphi-Quellcode:
procedure test;
var testarray:tarray<string>;
iscontained:boolean;
const A='ABC';//some string;
begin
iscontained:=false;
TParallel.For(0, 4, //kleines array nur zum testen,
      Procedure(I: integer)
      Begin
    // Windows.Beep(3000, 20);
         If Testarray[I].Equals(A)
          Then
        begin Isscontained := not iscontained;
         break; //kann ich hier so aussteigen?
        end;

//machwas
        // inc(i);
      End);

In einem demoprojekt (console) läuft der code auch einwandfrei durch. Sobald ich aber das selbe snipplet in eine externe dll auslagere hängt der code ohne ersichtlichen grund (debuggen nicht möglich). GgF IDE Absturz.
Im moment habe ich noch gar keinen worker code in die schleife eingebaut. (sondern NUR die line mit "windows.beep").


PS Der Code ließe sich auch anders gestalten, zb, mit vorheriger aufteilung in fixe listen und dann mehrere threads laufen lassen.
Gerne würde ich mir das sparen, wenn es hier eine einfachere Lösung gäbe.
Merci.

Ich danke für Vorschläge.

Geändert von Sequitar (16. Sep 2021 um 22:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.865 Beiträge
 
Delphi 12 Athens
 
#2

AW: DLL Tparallel.for loop deadock

  Alt 16. Sep 2021, 22:42
Rufst du CheckSynchronize aus dem Hostprogramm heraus über eine exportierte Funktion in der DLL auf? Nur dann funktioniert die Threadsynchronisation in einer Delphi-DLL normal.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: DLL Tparallel.for loop deadock

  Alt 16. Sep 2021, 22:55
Rufst du CheckSynchronize aus dem Hostprogramm heraus über eine exportierte Funktion in der DLL auf? Nur dann funktioniert die Threadsynchronisation in einer Delphi-DLL normal.

OK Danke!, auf so was wäre ich nie gekommen! - Also die Antwort ist erst mal : nein rufe ich nicht.
Wie genau würde ich dass denn praktisch machen? Hättest du ein kurzes Beispiel?

Geplant war als (kompliziertre Variante) auch Folgendes:

Also ich kommuniziere mit der DLL über ein interface. Innerhalb der interface-Implementierung, zb. tsomecontainer=class private fworker:tmyworkerthread; {handlearray und waitfor multiple muss noch gebaut werden, sobald der eine hier halt läuft...} end; habe ich dann mehrere worker threads geplant, die mir eine (bisher lange) berechnung parallelisieren sollten.

Von ausserhalb der dll rufe ich dann nach fertigstellung aller einzelner Threads und der berechnung eigentlich nur das gemeinschaftliche ergebnis ab.


Das wäre mir nur relativ zu viel Aufwand hierfür.

Geändert von Sequitar (16. Sep 2021 um 22:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.865 Beiträge
 
Delphi 12 Athens
 
#4

AW: DLL Tparallel.for loop deadock

  Alt 17. Sep 2021, 00:50
Wie genau würde ich dass denn praktisch machen? Hättest du ein kurzes Beispiel?
Delphi-Quellcode:
unit DllThreadSync;

// Dient zur Nutzung der Threadsynchronisation in einer DLL.
// Nutzung:
// Im OnIdle die exportierte Prozedur ExecuteIdleEvent aufrufen.

interface

uses
  System.Classes;

implementation

procedure ExecuteIdleEvent; stdcall;
begin
  CheckSynchronize;
end;

exports
  ExecuteIdleEvent;

end.
Die Unit bindest du einfach in die DLL ein und rufst im OnIdle der Hostanwendung die exportierte Prozedur ExecuteIdleEvent auf.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: DLL Tparallel.for loop deadock

  Alt 26. Sep 2021, 00:31
Super!! Vielen Dank für den Tip. Das funktioniert einwandfrei.
Sorry, dass ich jetzt erst antworte. Aber ich kam bisher noch nicht dazu es auszuprobieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.325 Beiträge
 
Delphi 12 Athens
 
#6

AW: DLL Tparallel.for loop deadock

  Alt 26. Sep 2021, 04:55
Die andere Alternative wäre, die EXE und DLL mit Laufzeitpackages zu kompilieren.

Gut, "handlicher" wäre es, wenn es direkt von Embarcadero eine Unit gäbe, um derartige Verknuppelungen "automatisch" in die DLL einzubinden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz