CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z Formularzem w DLL i watkiem w formularzu.

Problem z Formularzem w DLL i watkiem w formularzu.

dział ogólny

Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez Darek_C++ » piątek, 17 grudnia 2010, 14:39

Kolejny problem jest taki, że biblioteka DLL "zawiera" formularz który wykonuje operacje w wątkach.
Biblioteka dll dołączana jest statycznie do głównego programu.
Formularz w bibliotece dll powinien być wywoływany jako okno niemodalne Form2->Show(); by mógł być używany niezależnie z głównym oknem programu.

Problem jest taki, że formularz się otwiera, ale jeśli jest otwierany niemodalne czyli tak jak chciałbym Form2->Show(); nie rusza w nim wątek.
Watek rusza gdy formularz z DLL otwieram modalnie Form2->ShowModal();

Najważniejsze kody są następujące:
KOd z DLL otwierający formularz:
KOD cpp:     UKRYJ  
#include <vcl.h>

#include <windows.h>
#include "Unit2WDll.h"

#pragma hdrstop

#pragma argsused

extern "C" __declspec(dllexport) void ShowDllForm();

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------

void ShowDllForm()
{
        Application->Handle = Form2 ;
        TForm2 *Form2 = new TForm2(Application);
        Form2->Caption = "Form2 Wywolano z DLL";
        Form2->Show();
}


Sam formularz wywołujący watek:
KOD cpp:     UKRYJ  
#include <vcl.h>
#pragma hdrstop

#include "Unit2WDll.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
        Memo1->Lines->Add("TForm2 Start...") ;
        Watek = new MyWatek(true);
        Watek->Memo1 = Memo1;
        Watek->OnTerminate = MyOnTerminate;
        Watek->Resume();
        this->ileWatkow++;
        Memo1->Lines->Add((String)      Watek->ThreadID);

}
//---------------------------------------------------------------------------
void __fastcall TForm2::MyOnTerminate(TObject *Sender)
{
        this->ileWatkow --;
        Memo1->Lines->Add((String)      this->ileWatkow);
}
void __fastcall TForm2::FormCreate(TObject *Sender)
{
                Memo1->Clear();
}
 


Okno główne programu:
KOD cpp:     UKRYJ  
#include <vcl.h>
#pragma hdrstop

#include "Unit3TestujDll.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;

extern "C" __declspec(dllimport) void ShowDllForm();

//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{

}

//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
        ShowDllForm();
}


Może i tym razem uda się Wam mi pomóc na co gorąco liczę ;)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez polymorphism » piątek, 17 grudnia 2010, 15:12

To przeglądałes? -> link
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez Darek_C++ » piątek, 17 grudnia 2010, 15:16

Tak, przeglądałem i ?
---
Nie ma tam rozwiązania mojego problemu ... watek nie startuje :(
Inaczej pojawia się ID wątku,
TForm2 Start...
3128
ale nie jest on wykonywany, bo nie ma wyników w Memo1
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez polymorphism » piątek, 17 grudnia 2010, 15:33

A co to za cudo?
KOD cpp:     UKRYJ  
Application->Handle = Form2 ; //<--- !!!
TForm2 *Form2 = new TForm2(Application);
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez Darek_C++ » piątek, 17 grudnia 2010, 15:49

Jeśli dam tak jak Pisałeś w http://www.programowanie.cal.pl/forum/v ... f=5&t=1155

KOD cpp:     UKRYJ  
extern "C" __declspec(dllexport) void __stdcall ShowDllForm(TForm* parent);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------

void __stdcall ShowDllForm(TForm* parent)
{

   Application->Handle = parent ;
   TForm2 *Form2 = new TForm2(Application);
   Form2->Caption = "Form2 Wywolano z DLL";
   Form2->Show();
}


W formularzu głównego programu:
KOD cpp:     UKRYJ  
extern "C" __declspec(dllimport) void __stdcall ShowDllForm(TForm* parent);

//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{

}

//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
        ShowDllForm(this);
}

Pojawia się błąd:
Obrazek
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez polymorphism » piątek, 17 grudnia 2010, 15:57

Człowieku, zajrzyj od czasu do czasu do dokumentacji! Czy właściwość Handle przyjmuje wskaźnik TForm*?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez Darek_C++ » piątek, 17 grudnia 2010, 16:15

Możesz coś więcej powiedzieć jak to powinno być kodowane tak a by działał watek?

Jeśli zrobię jak jest podane tutaj: http://bcbjournal.org/articles/vol2/980 ... _a_DLL.htm
KOD cpp:     UKRYJ  
//W dll:
void ShowDllForm(TForm* parent)
{

  TDLLForm* form = new TDLLForm(parent);
  form->Show();
}
//w formularzu
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  ShowDllForm(this);  
}
Też wątek się nie wykonuje...

Tak też próbowałem:
KOD cpp:     UKRYJ  
/// W DLL
extern "C" __declspec(dllexport) void __stdcall ShowDllFormXX(HANDLE hMy);
void __stdcall ShowDllFormXX(HANDLE hMy)
{
   Application->Handle = hMy;
   TForm2 *Form2 = new TForm2(Application);
   Form2->Caption = "Form2 Wywolano z DLL HANDLE ";
   Form2->Show();
}

// W oknie glownym porgramu :
extern "C" __declspec(dllimport) void __stdcall ShowDllFormXX(HANDLE hMy);
void __fastcall TForm3::Button1Click(TObject *Sender)
{
        ShowDllFormXX(this->Handle);
}

Nadal wątek się nie wykonuje :( :(

Jeśli formularz z wątkiem dodam do głównego programu i go wywołam to działa,
KOD cpp:     UKRYJ  
// Główny porgram
#include "Unit2WDll.h"
void __fastcall TForm3::Button2Click(TObject *Sender)
{
   TForm2 *Form2 = new TForm2(this);
   Form2->Caption = "Form2 Wywolano z TForm3";
   Form2->Show();
}

wywołany niemodalnie z DLL nie chce mi działać :cry:
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez polymorphism » piątek, 17 grudnia 2010, 22:00

Tak sobie myślę, że wątek w rzeczywistości startuje, tylko Synchronize nie działa jak trzeba. Problemem jest to, że pętla komunikatów, potrzebna do działania Synchronize, jest po stronie aplikacji, dlatego w przypadku DLL-ki prośby o zsynchronizowanie wywołań metod pozostają bez odzewu. To by tłumaczyło, dlaczego w trybie modalnym wszystko jest jak trzeba - w tym trybie okno odpala swoją własną, lokalną pętle komunikatów.

Opcje są dwie:
  • zrezygnuj z synchronizacji via Synchronize (choć nie wiem, jak miałaby wyglądać ręczna synchronizacja odwołań do formy czy innych elementów VCL-a).
  • zrezygnuj z DLL-ki <- opcja chyba najsensowniejsza
___
p.s. oczywiście w tych moich rozmyślaniach mogę się mylić, wszak z VCL-a nie korzystam, więc wszystko opieram na domysłach.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Formularzem w DLL i watkiem w formularzu.

Nowy postprzez Darek_C++ » piątek, 17 grudnia 2010, 22:36

polymorphism napisał(a):zrezygnuj z synchronizacji via Synchronize (choć nie wiem, jak miałaby wyglądać ręczna synchronizacja odwołań do formy czy innych elementów VCL-a).
Trafiłeś w sedno, bo wątek się uruchamia tylko nie działa w tym wypadku Synchronize czyli jak dam:
KOD cpp:     UKRYJ  
void __fastcall MyWatek::Execute()
{
        Memo1->Lines->Add("Start Watku bez Synchronize...") ;
        for(int jj = 0; jj < 20; jj++)
        {
                Sleep(RandomRange(500, 1000));
                Memo1->Lines->Add((String) jj) ;
        }
        Memo1->Lines->Add("Stop Watku Synchronize ...") ;
}
Tak działa, ale bez synchronizacji najprawdopodobniej przy kilku wątkach naraz prędzej czy później program się wysypie :(
W tej synchronizacji IMHO pomógł by tutaj mutex, ale to znowu ograniczy mi o ile się nie mylę wykonywanie tylko do jednego wątku naraz :)

polymorphism napisał(a):zrezygnuj z DLL-ki <- opcja chyba najsensowniejsza.
Dll chciałem zastosować po to by móc w łatwy sposób dany moduł programu [okno z operacjami w wątkach] wykorzystać w innym programie tylko korzystając z DLL, ale jeśli nie mogę sobie z tym poradzić to faktycznie nic innego mi nie pozostaje jak rezygnacja z DLL i dołączanie plików do następnego projektu :roll:
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości