Biblioteka dll a wielowątkowość

Biblioteka dll a wielowątkowość
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Zielona Góra
0

Cześć,

powiedzmy że jest taka sytuacja: potrzebuję wydrukować np. 100 stron. Przygotowanie takiego wydruku trochę trwa. Nie chciałbym jednak blokować głównej aplikacji. Czy rozwiązanie z biblioteką dll która będzie zajmować się przygotowaniem danych oraz ich wydrukiem (wszystko przy użyciu fast report) rozwiąże problem?
Główna aplikacja wysyła rozkaz wydruku i wraca do normalnej pracy a cały proces wydruku odbywać się będzie przy użyciu biblioteki.

Czy takie coś będzie działać?

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Postów:3561
2

A dlaczego tego nie mógłby robić Main w innym wątku ?
Widzę, że odcięcie problemu robisz gdzie nie tzreba, na szczegółach implementacyjnych a nie istocie. DLL ma niewiele do tak postawionego zagadnienia.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Zielona Góra
0

Wielowątkowość to pierwsze co zrobiłem i to na dwa sposoby: biblioteką PPL a następnie "normalnymi" wątkami. Niestety jest pewien problem o którym nie wspomniałem w pierwszym poście bo nie było to kwestią mojego pytania. W skrócie chodzi o fastreport oraz jego lekki problem z pracą równoległą (a dokładnie ze współdzieleniem danych). Może na razie nie wchodźmy w to, bo nie jest to głównym wątkiem tego tematu (jak będziecie chcieli to coś więcej o tym napiszę).

Dlatego ponawiam pytanie: czy taki sposób drukowania przez dll będzie traktowany jak osobny wątek z punktu widzenia systemu operacyjnego?

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Postów:3561
0

To nie raportujesz z baz SQL? Wygląda jakbyś dane brał z plików? Dzielnie jakich danych jest problematyczne?
Dużo tu brakujacych szczegółów.

Wątek ma dwa/trzy sensy: wątek w języku programowania, w systemie, i w procesorze.
Wątek systemowy jest bytem "prawie niewidzialnym" w tym sensie, że bardzo niewiele systemowego API od tego zależy, ma trochę stosu - oprócz tego że większość API jest w "jakimś" wątku.
Za to DLLka jest dość istotnym, np ma samodzielną gospodarkę pamięcią, pewnie by miała własne handlery plików (tu trochę gdybam)


Bo C to najlepszy język, każdy uczeń ci to powie
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Gorlice
5

Jak wywołasz funkcję z DLL w wątku głównym efekt będzie taki sam jakby kod funkcji był właśnie w głównym wątku aplikacji a jak to zrobisz w wątku pobocznym to będzie tak jak by kod był w poboczny. Po prostu biblioteka DLL kompletnie NIC tu pod tym względem nie zmienia. Zajmij się problemem synchronizacji, który według Ciebie występuje gdy drukujesz w wątku pobocznym, bo to trzeba rozwiązać.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Zielona Góra
0

Oczywiście dane pobieram z baz. Główny wątek ma tylko wywoływać wydruk, przekazując jakieś tam parametry, np. numer rekordu nagłówka dokumentu a reszta już ma się wykonywać w tle.

Dlaczego tak mocno się uwziąłem na "rozdzielenie" wydruku od głównego programu? A no dlatego że tak naprawdę drukuję raport oraz jego kopię na innej drukarce (termicznej). Okazało się że fast report po wydruku tak jakby psuje dane i trzeba odczekać troszkę czasu (około 200 ms na linię raportu a tak naprawdę na fizyczne wydrukowanie raportu, niestety nie ma w fast report funkcjonalności która mogłaby sprawdzić czy wydruk już się ukończył) aby można było puścić ten sam raport na inną drukarkę.
Jako że fast report jest "odporny" na wątki ze względu na pewne współdzielenie danych (jak pisałem powyżej) to wymyśliłem sobie że pierwszy wydruk mogę nawet zrobić normalnie z głównego programu (w końcu nie trzeba czekać na wydruk a tylko na załadowanie danych do spoolera) ale przed uruchomieniem następnego wydruku trzeba będzie poczekać troszkę czasu a klient za bardzo nie chce czekać. Dlatego wymyśliłem sobie że to co jest w dll-ce być może jest traktowane jako całkiem zewnętrzny program i tamte wystąpienie fast reportu nie będzie wpływać na moje z głównego programu.
Po prostu wywołam odpowiednią procedurę w dll-ce i reszta mnie nie interesuje.

Ale czy to zadziała? Pytam bo być może ma ktoś doświadczenia?

robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Zielona Góra
0
kAzek napisał(a):

Jak wywołasz funkcję z DLL w wątku głównym efekt będzie taki sam jakby kod funkcji był właśnie w głównym wątku aplikacji a jak to zrobisz w wątku pobocznym to będzie tak jak by kod był w poboczny. Po prostu biblioteka DLL kompletnie NIC tu pod tym względem nie zmienia. Zajmij się problemem synchronizacji, który według Ciebie występuje gdy drukujesz w wątku pobocznym, bo to trzeba rozwiązać.

O widzisz, zanim opisałem problem chyba dostałem odpowiedź. Czyli nie tędy droga raczej.

Czyli powiedzmy całkiem teoretycznie:
w wątku głównym programu wywołuję funkcję z dll test która robi Sleep(5000) - która blokuje normalnie program a następnie ShowMessage('odblokowano').
rozumieć mam że aplikacja będzie zablokowana na 5 sekund a następnie po tym czasie pokaże się komunikat. Czy też normalnie będzie działać a po 5 sekundach pojawi sie komunikat?

edytowany 1x, ostatnio: robertz68
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
3

Tak, zablokuje się na 5 sekund.

dll nie ma nic do tego czy główny wątek się zablokuje czy nie. A Twój problem jest gdzie indziej - w pobieraniu danych jak sam napisałeś


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Zielona Góra
0

Ok, odpowiedź otrzymałem. Wniosek, nie tędy droga.
Zrobię to osobnym exekiem który będzie czymś w rodzaju serwera wydruku i już.

Dzięki za odpowiedź.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 4 godziny
  • Postów:1595
1

Oj dawno nie używałem FR ale coś tam jeszcze pamiętam. Ja realizowałem to tak:

  1. Dane do raportu przekazywałem z aplikacji aby każda instancja raportu nie odpalała tego samego zapytania po stronie samego pliku FR3- normalnie przekazujesz dataseta.

  2. FR z tego co pamiętam musi mieć swoją instancję więc ja u siebie miałem klasę, która miała zawierała wewnętrzny licznik instancji danej klasy. Ponadto sama funkcja EXECUTE ubrana również była w wątek więc technicznie każde wywołanie FR miało swoją instancję, w swoim wątku dzięki czemu jednocześnie szedł wydruk na kilka drukarek.

Niestety gotowego kodu u siebie nie mam bo było to robione w firmie ale z tego co pamiętam takie wielowątkowe wywołanie FR załatwiało wydruk jednocześnie na wielu drukarkach.

Co do samego pomysłu z takim "print serwerem" to teorytycznie też załatwi temat ale jest to moim zdaniem nieeleganckie rozwiązanie ;)

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1
woolfik napisał(a):

Oj dawno nie używałem FR ale coś tam jeszcze pamiętam. Ja realizowałem to tak:

  1. Dane do raportu przekazywałem z aplikacji aby każda instancja raportu nie odpalała tego samego zapytania po stronie samego pliku FR3- normalnie przekazujesz dataseta.

Ja tak nie robię, wolę mieć świeże dane do wydruku.
Ale to trochę taka moja specyfika, informacje zmieniają się w zastraszającym tempie ;-)

  1. FR z tego co pamiętam musi mieć swoją instancję więc ja u siebie miałem klasę, która miała zawierała wewnętrzny licznik instancji danej klasy. Ponadto sama funkcja EXECUTE ubrana również była w wątek więc technicznie każde wywołanie FR miało swoją instancję, w swoim wątku dzięki czemu jednocześnie szedł wydruk na kilka drukarek.

Tak, ale to nie koniec:
https://www.fast-report.com/pl/faq/13/98/

Niestety gotowego kodu u siebie nie mam bo było to robione w firmie ale z tego co pamiętam takie wielowątkowe wywołanie FR załatwiało wydruk jednocześnie na wielu drukarkach.

Co do samego pomysłu z takim "print serwerem" to teorytycznie też załatwi temat ale jest to moim zdaniem nieeleganckie rozwiązanie ;)

Dlaczego nieeleganckie?
A poza tym, jest przecież FastReport Server ;-)

woolfik
nieeleganckie jeśli raport na drukarkę A robimy z głównej aplikacji, a wydruk na drukarkę B robimy z printservera - o taki brak elegancji mi chodziło. Albo wszystko w jedną apkę albo w oddzielny serwer. Kopiowanie funkcjonalności do oddzielnego exe jest moim zdaniem nieeleganckie :)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)