GetNextFileNameForViewer vrací FALSE a scrBusy je TRUE

Podpora vývojářů nových pluginů, oznámení o nových pluginech nezávislých autorů a diskuse o nich.
User avatar
stepand76
Plugin Developer
Plugin Developer
Posts: 455
Joined: 16 Apr 2007, 21:22
Location: Pardubice, Czech Republic

GetNextFileNameForViewer vrací FALSE a scrBusy je TRUE

Post by stepand76 »

GetNextFileNameForViewer vrací FALSE a scrBusy je TRUE

Při ladění chvíli (cca půl vteřiny) trvá, než se to z té funkce dostane. Když jsem zkusil nastavit nesmyslný srcUID tak je volání proběhne okamžitě, ale to je mi k ničemu.

Je to tak se všemi ostatními funkcemi pro viever:

GetPreviousFileNameForViewer
IsFileNameForViewerSelected
SetSelectionOnFileNameForViewer

Proč je to zaneprázdněné? Jde o normální file system (C:\Zumpa), žádný archiv, nebo síťová jednotka.

Dáte mi tip?

Díky
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5229
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post by Jan Rysavy »

Zkuste prosím adresář Zumpa promazat, aby obsahoval pouze jediný (prohlížený) soubor. Nastavte do tohoto adresáře oba panely. Zlobí to také?

Zlobí to pouze během ladění nebo i spuštěné mimo debugger?
User avatar
stepand76
Plugin Developer
Plugin Developer
Posts: 455
Joined: 16 Apr 2007, 21:22
Location: Pardubice, Czech Republic

Post by stepand76 »

Jan Rysavy wrote:Zkuste prosím adresář Zumpa promazat, aby obsahoval pouze jediný (prohlížený) soubor. Nastavte do tohoto adresáře oba panely. Zlobí to také?
Ano, zlobí.
Jan Rysavy wrote:Zlobí to pouze během ladění nebo i spuštěné mimo debugger?
Zlobí to i mimo debugger.

Nezdržujte se tím moc, určitě dělám něco špatně, protože by jinak nepracovaly ani ostatní prohlížecí pluginy.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5229
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post by Jan Rysavy »

Petr se na to podíval a zjistil, že funkce nefunguje z hlavního threadu. Všechny naše viewery (kde se funkce používá) běží ve vlastních vláknech. Zároveň musí hlavní vlákno běžet (aplikační smyčka), aby se distribuovaly zprávy.

Musíme toto buď dopsat do komentáře nebo se pokusit funkci upravit tak, aby fungovala z hlavního vlákna.

Je to Váš případ? K čemu funkci používáte, píšete viewer?
User avatar
stepand76
Plugin Developer
Plugin Developer
Posts: 455
Joined: 16 Apr 2007, 21:22
Location: Pardubice, Czech Republic

Post by stepand76 »

Jan Rysavy wrote:Petr se na to podíval a zjistil, že funkce nefunguje z hlavního threadu. Všechny naše viewery (kde se funkce používá) běží ve vlastních vláknech. Zároveň musí hlavní vlákno běžet (aplikační smyčka), aby se distribuovaly zprávy.

Musíme toto buď dopsat do komentáře nebo se pokusit funkci upravit tak, aby fungovala z hlavního vlákna.

Je to Váš případ? K čemu funkci používáte, píšete viewer?
Je to můj případ. Přiznám se, že jsem to trochu tušil. Ale v demopluginu v SDK je (sice zakomentovaná) verze pro volání z hlavního vlákna, tak jsem si říkal, že to třeba fungovat má.

Nechám to na vás co s tím uděláte, ale asi bych hlasoval pro to aby tyto funkce bylo možné volat i z primárního vlákna.

Píšu viewer. Až na toto je funkční.

Díky za podporu.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5229
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post by Jan Rysavy »

Provozováním prohlížeče v hlavním vlákně Salamandera narazíte určitě na další problémy. Jen tak letmo vidím dva: vlastní message loop by se Vám hodila pro chod akcelerátorů. Viz standardní implementace v našich prohlížečích.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!window->IsMenuBarMessage(&msg) &&
!TranslateAccelerator(window->HWindow, ViewerAccels, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Další problém vidím v tom, že pokud bude hlavní vlákno Salamandera zaneprázdněné (stačí například stisknout Ctrl+Shift+F10 v rootu disku), Váš prohlížeč se přestane překreslovat a bude vypadat zakouslý.

Další problémy očekávám při zavírání Salamandera, kde se explicitně žádají o zavření všechna okna prohlížečů a neočekává se, že by neběžely ve svých vláknech.

A to jsem raději nedělal audit aplikační smyčky Salamandera, ta je celkem pekelná, 300 řádků dlouhá. Šance, že bude dělat pro Vás něco nechtěného, je značně vysoká.

Zkrátka provoz vieweru z vlákna Salamandera je neodladěná věc, kde budete narážet. Z hlediska technologického jde o podřadné řešení proti běhu ve více vláknech. Máte nějaký důvod, proč nepřevzít implementaci z demopluginu?
User avatar
stepand76
Plugin Developer
Plugin Developer
Posts: 455
Joined: 16 Apr 2007, 21:22
Location: Pardubice, Czech Republic

Post by stepand76 »

Díky za informace.
Jan Rysavy wrote:Máte nějaký důvod, proč nepřevzít implementaci z demopluginu?
Plugin píšu v Delphi. Jak známo VCL (vizuální knihovna komponent pro Delphi) není thread-safe. Takže to je důvod. Vyzkouším, zda by šlo alespoň všechna okna prohlížeče přesunout do jednoho (separátního) vlákna.

Co se týče běhu prohlížeče v hlavním vlákně mám tyto postřehy:
Jan Rysavy wrote:vlastní message loop by se Vám hodila pro chod akcelerátorů.
Nevím jak v CPP, ale v Delphi má každé okno svoji vlastní smyčku zpráv, takže se o to nemusím starat.
Jan Rysavy wrote:Další problém vidím v tom, že pokud bude hlavní vlákno Salamandera zaneprázdněné (stačí například stisknout Ctrl+Shift+F10 v rootu disku), Váš prohlížeč se přestane překreslovat a bude vypadat zakouslý.
Ano, to máte pravdu.
Jan Rysavy wrote:Další problémy očekávám při zavírání Salamandera, kde se explicitně žádají o zavření všechna okna prohlížečů a neočekává se, že by neběžely ve svých vláknech.
Okna prohlížečů mám ve vlastním seznamu a pokud jsou otevřená a dojde k uvolnění pluginu (unkončení Salamandera) uvolním je.

Každopádně vás nechci nutit k nějakým zásadním úpravám, kvůli mému prohlížecímu pluginu. Nicméně musím říci, že práci by mi to usnadnilo.

PS: Pokud se v něčem pletu, tak se omlouvám.
User avatar
stepand76
Plugin Developer
Plugin Developer
Posts: 455
Joined: 16 Apr 2007, 21:22
Location: Pardubice, Czech Republic

Post by stepand76 »

Nezabývejte se tím. Já si s tím poradím.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5229
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post by Jan Rysavy »

Pokud byste si založil nové vlákno s vlastní message loop a z něj řídil všechna okna Vašiho vieweru, nebude vadit, že VCL neni thread safe. Nebudete s nikým kolidovat a kdyby se něco málo naskytlo, ošetříte to místo synchronizací.

Ještě bych se chtěl zeptat na toto:
Ale v demopluginu v SDK je (sice zakomentovaná) verze pro volání z hlavního vlákna, tak jsem si říkal, že to třeba fungovat má.
Které místo v kódu máte přesně na mysli?
User avatar
stepand76
Plugin Developer
Plugin Developer
Posts: 455
Joined: 16 Apr 2007, 21:22
Location: Pardubice, Czech Republic

Post by stepand76 »

Jan Rysavy wrote:Pokud byste si založil nové vlákno s vlastní message loop a z něj řídil všechna okna Vašiho vieweru, nebude vadit, že VCL neni thread safe. Nebudete s nikým kolidovat a kdyby se něco málo naskytlo, ošetříte to místo synchronizací.
Ano tak jsem to myslel. Pokusím se to udělat a uvidíme.
Jan Rysavy wrote:Které místo v kódu máte přesně na mysli?
Měl jsem na mysli kus kódu v souboru viewer.cpp za komentářem

Code: Select all

varianta spusteni threadu vieweru bez pouziti objektu CThread
ale teď vidím, že jsem to špatně pochopil. Omlouvám se.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5229
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post by Jan Rysavy »

stepand76 wrote:

Code: Select all

varianta spusteni threadu vieweru bez pouziti objektu CThread
ale teď vidím, že jsem to špatně pochopil. Omlouvám se.
Nic se neděje, Demoplug už je stará věc. Pro SDK 2.52 máme připravený aktualizovaný a zeštíhlený Demoview (a ve frontě čekají další demo pluginy). To ale ještě chvíli potrvá.
Post Reply