Announcement

Collapse
No announcement yet.

Units und TThreadLists: EAccessViolation...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Units und TThreadLists: EAccessViolation...

    Guten Tag zusammen

    Ich habe folgendes eigentlich simples Problem: Der VCL-Haupt-Thread sollte eine TThreadList *ThreadTaskList mit Daten abfüllen, während X Threads diese abarbeitet. <br>
    Dummerweise ist *ThreadTaskList in einer neuen Unit global definiert und wird dort auch in einer neuen Klasse instanziert. Anscheinend ist dadurch der Zugriff auf das TThreadList-Objekt über die Unit hinaus (obwohl ich die Klasse TTest verwende!) nicht möglich und der VCL-Haupt-Thread bekommt immer ne EAccessViolation in der ntdll.dll (?)!
    <BR><BR><B>Jetzt die Frage: Darf auf gemeinsam genutzen Speicher wirklich nicht über mehrere Units hinweg zugegriffen werden? Oder gibts dafür ne elegantere Lösung?</B>
    <br><br>Hier ein Bsp. das nicht klappt:<BR>
    <PRE>//----- Unit2.h -----
    TThreadList *ThreadList;

    class TTest
    {
    private:

    public:
    TTest(){ThreadList = new TThreadList;}
    ~TTest()
    {
    delete ThreadList;
    }

    void StartThreads(void)
    {
    //...
    }

    void ClearThreadList(void);
    };

    //----- Unit2.cpp -----
    void TTest::ClearThreadList(void)
    {
    ThreadList->LockList();
    ThreadList->Clear();
    ThreadList->UnlockList();
    }

    //************************************************** *************************

    //----- Unit1.cpp -----
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TTest *Test = new TTest;

    Test->ClearThreadList();

    delete Test;
    }</PRE><BR><BR>
    Wenn ich die Methode ClearThreadList() inline in TTest deklariere klappts jedoch komischerweise!

    Merci!

    Gruss - Boris

  • #2
    Vielleicht liegt es ja daran, dass das TThreadList::Clear() selbst versucht die Liste zu sperren, was aber nicht gelingen kann, da Du sie bereits im Schritt zuvor gesperrt hast...

    Grüße Joche

    Comment


    • #3
      Hallo Jochen

      Ja stimmt, hätte sein können, ist kein sauberes Bsp. von mir, liegt jedoch nicht daran. <I>(ThreadList->Clear() sollte schon Thread-sicher sein, die Sperrerei kann also einfach weggelassen werden.)</I> <BR><BR>
      Aber wie gesagt, wenn ich die Methode inline definiere, klappts ja auch. Das Problem besteht auch nur, wenn die Klasse in einer andern Unit (z.B. Unit2) definiert ist, als deren Methoden-Aufruf (in Unit1)stattfindet.<BR><BR>
      Gruss - Bori

      Comment


      • #4
        Naja, ich habs: Ich Esel hab die ThreadList nicht in der Unit2.cpp definiert und dann in Unit2.h nicht mit <B>extern</B> TThreadList *ThreadList; darauf verwiesen! Das gibt anscheinend solch komische Ergebnisse, da der Compiler in jeder einzelnen Unit wo Unit2.h eingebunden wird, einen neuen Zeiger für die ThreadList erstellt. Es wurde jedoch nur jener Zeiger in Unit2 auch wirklich in TTest()initialisiert.

        Trotzdem merci an alle die sich Gedanken darüber gemacht haben

        Comment

        Working...
        X