![]() |
Anzeige:
|
|
|||||||
| XProfan Alles rund um die Programmiersprache XProfan. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hallo zusammen, Hi Frank, in meinem Projekt habe ich 3 Tabellen. 2 sichtbare & 1 große, unsichtbare (ca 150.000 Einträge). Aus der großen suche ich ich mit 'SearchText" in einem vorher eingegrenzen Bereich von etwa 15.000 Zeilen einen Suchbegriff in einer Spalte. Dieser kann mehrmals vorkommen (5-50 mal). Diese Spalte ist natürlich sortiert, so das dieser Suchbegriff nicht verstreut vorliegt. Bei einem Treffer kopiere ich die komplette Zeile (5 Spalten) mit 'CopyLineTo' in die sichtbare Zieltabelle.
Um die Suchgeschwindigkeit zu erhöhen habe die Listview.dll mit @importDll(,) statisch gelinkt (hab ja jetzt XProfan11.2 Code:
zei& = 0 While 1 zei&=SearchText(LV&,zei&,ende&,spaltennr,suchbegriff#,2,0) ' suchen Case zei& = -1 : BREAK 'wenn keinTreffer, schleife verlassen copylineto(LV&,zielLV&,zei&,i&) 'zeile in die anzeigetabelle kopieren inc i& 'zeilenindex für anzeigetabelle für den nächsten Treffer erhöhen inc zei& 'suchstart-index für die nächste runde erhöhen endwhile Ich vermute, daß Windows mit der visuellen Aktualisierung der Zieltabelle nicht hinterher kommt & kam deshalb auf die Idee die vis. Akt. während des Kopierens abzuschalten & zum Schluss die Tabelle 1x neu zeichnen lassen. Ich versprech mir da einen Geschwindigkeitsgewinn. Unter den Listview-Funktionen gibt es ja die 'UpdateListview(H)', um ein Neuzeichnen zu erzwingen - jetzt bräuchte ich das Gegenstück dafür: Neuzeichnen abschalten Gibt es da Möglichkeiten? Gruß Jörg |
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Der Grund dafür ist wahrscheinlich:
Xprofan Programme sind nicht multithreadingfähig. Werden Funktionen in der DLL aufgerufen, geschieht das im selben Thread, in dem Messages verarbeitet werden. Solange Code innerhalb der DLL ausgeführt wird, werden keine Messages verarbeitet. In der compilierten EXE werden Messages nach jeder zwanzigsten Zeile verarbeitet - in der Profan.exe, die über den Editor ausgeführt wird, nach jeder Zeile. Neuzeichnen abschalten: Erfolg& = External("User32","LockWindowUpdate",Handle_der_Listview&) Soll wieder aktualisiert werden, das gleiche nochmals aufrufen: Erfolg& = External("User32","LockWindowUpdate",0) Code:
zei& = 0
External("User32","LockWindowUpdate",LV&)
While 1
zei&=SearchText(LV&,zei&,ende&,spaltennr,suchbegriff#,2,0) ' suchen
Case zei& = -1 : BREAK 'wenn keinTreffer, schleife verlassen
copylineto(LV&,zielLV&,zei&,i&) 'zeile in die anzeigetabelle kopieren
inc i& 'zeilenindex für anzeigetabelle für den nächsten Treffer erhöhen
inc zei& 'suchstart-index für die nächste runde erhöhen
endwhile
External("User32","LockWindowUpdate",LV&)
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT Geändert von AHT (15.10.2010 um 15:21 Uhr) |
|
|
|
|
|
#3 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
|
Ich denke zum wieder frei geben sollte es
External("User32","LockWindowUpdate",0) heißen
__________________
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai. http://dieterzornow.gmxhome.de |
|
|
|
|
|
#4 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Danke Bangkok. Hast Recht, das wäre noch besser
Code:
zei& = 0
External("User32","LockWindowUpdate",LV&)
While 1
zei&=SearchText(LV&,zei&,ende&,spaltennr,suchbegriff#,2,0) ' suchen
Case zei& = -1 : BREAK 'wenn keinTreffer, schleife verlassen
copylineto(LV&,zielLV&,zei&,i&) 'zeile in die anzeigetabelle kopieren
inc i& 'zeilenindex für anzeigetabelle für den nächsten Treffer erhöhen
inc zei& 'suchstart-index für die nächste runde erhöhen
endwhile
External("User32","LockWindowUpdate",0)
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT Geändert von AHT (15.10.2010 um 15:22 Uhr) |
|
|
|
|
|
#5 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Jo! das funzt prächtig, Danke euch beiden!
Ich kann also damit gezielt mehrere einzeln Fenster sperren, aber alle auf einmal wieder entsperren. Hat mir sehr geholfen Gibt es Geschwindigskeitstechnisch an der Suchroutine selbst noch was zu verbessern? Vllt. die Abbruchbedingung im Kopf definieren & auf case verzichten? Gruß Jörg |
|
|
|
|
|
|
#6 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Nein, du kannst immer nur ein Fenster zur Zeit sperren. Mit 0 hebst du die Sperrung auf.
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#7 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Man kann zwar alles mögliche dafür nehmen, aber vorgesehen ist:
Code:
~SendMessage(LV&, %WM_SETREDRAW, 0, 0) Code:
~SendMessage(LV&, %WM_SETREDRAW, 1, 0) PS: %WM_SETREDRAW entspricht 11 Gruß Thomas |
|
|
|
|
|
#8 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Vielleicht kann Jörg mal testen, ob die Message genausogut funktioniert wie LockWindowUpdate. Ich habe den Verdacht, das tut es nicht - ist aber nur eine Vermutung..
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#9 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
|
Nach meiner Erfahrung arbeitet die Message nicht so gut, vor allem wenn eine große Datenmenge eingeladen wird, versagt sie, das Update erfolgt etwas seltener als ohne Message, wird aber nicht vollständig unterdrückt. Deshalb verwende ich nur noch Lockwindowupdate()
__________________
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai. http://dieterzornow.gmxhome.de |
|
|
|
|
|
#10 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Der Repaint scheint mit LockWindowUpdate auch sicherer zu funktionieren.
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
|
#11 (Direktlink) | |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
siehe MSDN: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Zitat:
liegts dann wohl am MessageHandling von XProfan. Gruß Thomas |
|
|
|
|
|
|
#12 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
|
Ich denke mal, wenn z.B. 1000 Datensätze eingelesen werden müssen wirkt die Message nach ein paar Einträgen scheinbar nicht mehr. Bei den paar Dateien, die man mit drag/drop einfügt aber schon, da es ja sehr schnell passiert. An das profansche Messagehandling glaube ich in diesem Fall nicht.
__________________
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai. http://dieterzornow.gmxhome.de |
|
|
|
|
|
#13 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Da haste was mißverstanden, LockWindowUpdate ist nur und ausschließlich
für Drag'n Drop, um Dropsymbole über einem Fenster darzustellen. Für alles andere in der Art sollte man die Message nutzen. Gruß Thomas (Mein Englisch ist zwar auch sch..sse, aber mein Translator funzt gut |
|
|
|
|
|
#14 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
...wollte trotzdem mal die sendmessage-variante durchspielen. Ist ja wirklich ganz nützlich zu wissen, welche der beiden Varianten für so einem Fall die bessere ist. Und jetzt bietet sich ja die Möglichkeit, wo ich eh am tüfteln bin...
aaaaber - Gruß Jörg |
|
|
|
|
|
#15 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Code:
$H Windows.ph ~SendMessage(LV&, 11, 0, 0) // edit Code:
@SendMessage(LV&, 11, 0, 0) Geändert von ts-soft (15.10.2010 um 22:13 Uhr) |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| ListView DLL & WindowStyle 512 | Hovy | Dlls, Includes, Units & Prozeduren | 5 | 18.04.2010 11:37 |
| Wie baue ich listview ein? | Peter C. | Dlls, Includes, Units & Prozeduren | 12 | 31.03.2009 08:14 |
| listview | Peter C. | Spezielles | 6 | 29.03.2009 00:41 |
| Listview | Peter C. | Helfer & Tools | 3 | 28.03.2009 09:30 |
| Listview.dll & Odbc2Lv.prf | kelte | Dlls, Includes, Units & Prozeduren | 2 | 26.03.2009 19:20 |