purebasic.info

PureBasic forum
Текущее время: Пн ноя 19, 2018 12:28 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: что за юмор с тормозами для TreeGadget
СообщениеДобавлено: Пн ноя 05, 2018 1:26 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Пытаюсь ускорить, а тут бац и все получилось наоборот :o и тут вылезла такая закавыка.
Вобщем имеется два цикла, единтичных.

Но во втором цикле жуткий тормоз, почемуто.
Уже и дебугер одключал, всеодно тормоз :shock: :o

Вот тут все быстро
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LN=15000; количесвто итемов 
#tree=0
 
If OpenWindow(0, 100, 50, 355, 700, "TreeGadget", #PB_Window_SystemMenu)
    TreeGadget(#tree, 5, 10, 250, 650)
    Debug "---------------1111"
 
For a = 0 To LN
    AddGadgetItem (#tree, -1, "Item "+Str(a), 0, Random(5)+1)
    If A & $f=$f:WindowEvent();это нужно чтобы раздет немного обновлялся
    EndIf
    If A & $8ff=$8ff:WindowEvent(); это позволяет показывать скоко циклов пройшло
        Debug a
    EndIf
Next
 
Debug "---------------END"
 
Repeat : Event=WaitWindowEvent()
Until  Event= #PB_Event_CloseWindow
EndIf
 



А тут одкудовато тормоз :shock: :shock: :shock:
Главное тормоз выдазит в этой строчке
AddGadgetItem (#tree, -1, "Item "+Str(a), 0,1),
если ее сменить так, то быстрее, так там лишние телодвижения есть, почему она быстрее :?: :?: :?:
AddGadgetItem (#tree, -1, "Item "+Str(a), 0, Random(5)+1)
может там чегото лишнее на асемблере делает
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LN=15000; количесвто итемов 
#tree=0
 
If OpenWindow(0, 100, 50, 355, 700, "TreeGadget", #PB_Window_SystemMenu)
    TreeGadget(#tree, 5, 10, 250, 650)
    Debug "---------------1111"
 
For a = 0 To LN
    AddGadgetItem (#tree, -1, "Item "+Str(a), 0,1)
    If A & $f=$f:WindowEvent()
    EndIf
    If A & $8ff=$8ff:WindowEvent()
        Debug a
    EndIf
Next
 
Debug "---------------END"
 
Repeat : Event=WaitWindowEvent()
Until  Event= #PB_Event_CloseWindow
EndIf
 


Сергейчик глянь чего там на АСМе лишнего наворотили, может его както обойти.

Уже АСМ смотрел и долго не доумевал
Код:
1
2
3
4
5
6
        a:
       r=5
        ;r=Random(5)+1
        A1:
       AddGadgetItem (#tree, -1, "123", 0, r)
        a2:

дает такой код
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
; a:
l_a:
; r=5
  MOV    dword [v_r],5
;
; A1:
l_a1:
; AddGadgetItem (#tree, -1, "123", 0, r)
  PUSH   dword [v_r]
  PUSH   dword 0
  MOV    eax,_S2
  PUSH   eax
  PUSH   dword -1
  PUSH   dword 0
  CALL _PB_AddGadgetItem3@20
; a2:
l_a2:

А с рандомным числом такой
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; a:
l_a:
;
; r=Random(5)+1
  PUSH   dword 5
  CALL _PB_Random@4
  MOV    ebx,eax
  INC   ebx
  MOV    dword [v_r],ebx
; A1:
l_a1:
; AddGadgetItem (#tree, -1, "123", 0, r)
  PUSH   dword [v_r]
  PUSH   dword 0
  MOV    eax,_S2
  PUSH   eax
  PUSH   dword -1
  PUSH   dword 0
  CALL _PB_AddGadgetItem3@20
; a2:
l_a2:


Если переменная r меняется то быстрее, нозависимость савсем кривая
Для 15000 итемов результат разнится катастрофически,
Для
r=Random(5,1); 2 секунды
;r+1:If b>5:r=1:EndIf; 5 секунд
;r=5;12 секунд
эта строка всегда одна и таже:
AddGadgetItem (#tree, -1, "123", 0, r )
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
LN=15000; количесвто итемов 
#tree=0
 
If OpenWindow(0, 100, 50, 355, 700, "TreeGadget", #PB_Window_SystemMenu)
    TreeGadget(#tree, 5, 10, 250, 650)
    Debug "---------------1111"
    t=ElapsedMilliseconds()
    b=1
    c=0
    c2=0
    For a = 0 To LN
        a:
       ;
        r=Random(5,1); 2 Sek
        ;r+1:If b>5:r=1:EndIf; 5 sek
        ;r=5;12 Sek
        A1:
       AddGadgetItem (#tree, -1, "123", 0, r)
        a2:
       c+1:c2+1
        If c> 100 :WindowEvent():c=0:EndIf
        If c2>1000:c=0:Debug a:c2=0:EndIf
Next
Debug ""
Debug "---------------End"
Debug ElapsedMilliseconds()-t
 
Repeat : Event=WaitWindowEvent()
Until  Event= #PB_Event_CloseWindow
EndIf
 

одключал дебугер, результат одинаковый.
Пурик 5.46, уникод, пурифиер выключен.
ЧЕго ему нужно для ускорения :?:

_________________
искатель истины


Последний раз редактировалось balex1978 Пн ноя 05, 2018 3:11 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 3:03 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 654
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
время нет вникать.
Может сделать так чтобы евент 2 раза подряд не вызывалась? :roll:
Код:
1
2
3
4
5
6
7
 
 
If A & $8ff=$8ff:WindowEvent(); это позволяет показывать скоко циклов прошло
;сюда можно дописать WindowEvent() будет как у тебя 2-ой вызов
    elseIf A & $f=$f:WindowEvent();это нужно чтобы раздет немного обновлялся
 EndIf
 


Ты что рандом на флаг параметра что ли делаешь,так нельзя константы флагов заранее определены(естественно зависнит).:) :roll:
Код:
1
2
3
 
AddGadgetItem (#tree, -1, "Item "+Str(a), 0, Random(5)+1);5 аргумент флага
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 3:41 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Сергейчик, рандомные это только уровни директорий и все, они же будут браться из файла как даные.
Может я чегото нето делаю или нетуда сую?
Ну скорость реально в 2 сек и 12 сек это уже черезчур
Там и кода с гулькин нос(я про пуриковский, а не АСМ)

Цитата:
Ты что рандом на флаг параметра что ли делаешь,так нельзя константы флагов заранее определены(естественно зависнит)
Прикалываешся или шутишь :lol: : из справки:
AddGadgetItem (#tree, -1, "Item "+Str(a), 0, Random(5)+1)
Result = AddGadgetItem(#Gadget , Position , Text$ [, ImageID [, Flags]])
- TreeGadget(): поддерживает ImageID. Требуются 'Флаги', которые определяют новый подуровень.

Вроде ничего, все вроде верно, как в справке или я чегото нето понял?

Ну вот из справки сократил
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
If OpenWindow(0, 0, 0, 355, 200, "Гаджет Дерево Элементов", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TreeGadget(0, 10, 10, 160, 180)                                        ; Стандартный Гаджет "Дерево Элементов"
;    TreeGadget(1, 180, 10, 160, 180, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); "Дерево Элементов" с чек-боксами и без линий
    ID = 0
                AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 0)            ; используйте ImageID (x) в качестве 4-го параметра
t=ElapsedMilliseconds()
        For a = 0 To 10000
           ; AddGadgetItem(ID, -1, "Sub-элемент 1", 0, Random(5,1)); 0,7 сек
            AddGadgetItem(ID, -1, "Sub-элемент 1", 0, 1) ; 6 СЕК            ; Они находятся на первом подуровне
        Next
MessageRequester("", Str(ElapsedMilliseconds()-t ) )
 
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
 


Не, ну реальный глюк, в 10 раз скорость

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 5:51 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 654
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Просто ставить в рандоме в gadget с 0 уровня сразу 6 как то выглядит нелепо. :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 7:42 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Сергейчик писал(а):
Просто ставить в рандоме в gadget с 0 уровня сразу 6 как то выглядит нелепо. :roll:

Согласен, но работае, кушать непросит, неругается и незаикается. :) .

Думаеш если все правильно сделать то быстрее станет, :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
If OpenWindow(0, 0, 0, 355, 200, "Гаджет Дерево Элементов", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TreeGadget(0, 10, 10, 160, 180)                                        ; Стандартный Гаджет "Дерево Элементов"
    ID = 0
    AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 0)            ; используйте ImageID (x) в качестве 4-го параметра
    AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 1)
    AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 2)
    AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 3)
    AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 4)
    AddGadgetItem (ID, -1, "Узел "+Str(a), 0, 5)
   
    t=ElapsedMilliseconds()
    For a = 0 To 10000
       ; AddGadgetItem(ID, -1, "Sub-элемент 1", 0, Random(5,1)); 0,7 сек
        AddGadgetItem(ID, -1, "Sub-элемент 1", 0, 1) ; 6 СЕК            ; Они находятся на первом подуровне
    Next
    MessageRequester("", Str(ElapsedMilliseconds()-t ) )
 
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
 
 


Неа, рандомный 0,5 сек, а прямой 5,5 сек, ну шо за не справедливость.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 8:23 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 654
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
В каких не будь дллках есть такой контрол(может они быстрее работают)? :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 9:31 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
У меня есть супер быстрый виртуальный контрол,
только он на Делфи.Ну и примеров его работы нету
Можно и с СИ ДЛЛку какую нибудь, но чтобы иметь список АПИ и параметров более менее нормальный набор, чтобы не только итемы создавать но и перемещать и драг&дроп применять, за картинками негонюсь.

Знаешь, получается какой-то прикол, я сделал на АПИ создание 1000 итемов и получил 3 секунды, многовасто. Ну и как это пурик при рандомном варианте делает меньше чем за секунду,Хм. Юмор однако.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт ноя 06, 2018 7:33 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 694
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
это извращение
Код:
1
"Item "+Str(a)


замени на это
Код:
1
"Item "+a


и кода меньше и немного быстрей :D
вызов функции по любому требует времени, и как в ней само преобразование сделано тоже неизвестно, сколько там телодвижений
сравни их на асме


Цитата:
что за юмор с тормозами для TreeGadget

а ни кто и не обещал быструю винду :D


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт ноя 06, 2018 10:59 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
newJS писал(а):
это извращение
Код:
1
"Item "+Str(a)


замени на это
Код:
1
"Item "+a


и кода меньше и немного быстрей :D
вызов функции по любому требует времени, и как в ней само преобразование сделано тоже неизвестно, сколько там телодвижений
сравни их на асме


Смотрю, вот знаеш както нелегче, появились новые вызовы подпрограммы или функции, да и не в этом проблема, заметь скорость в начале очень большая, а потом умирает, ну прям как в виндовском блокноте.
"лишнее есть"
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
; b0:
l_b0:
; AddGadgetItem (#tree, a, Str(a), 0, 1)
  PUSH   dword [_PB_StringBasePosition]
  PUSH   dword 1
  PUSH   dword 0
  MOV    edx,[_PB_StringBasePosition]
  PUSH   edx
  PUSH   edx
  MOV    eax,dword [v_a]
  CDQ
  PUSH   edx
  PUSH   eax
  CALL _PB_Str_UNICODE@12
  ADD    dword [_PB_StringBasePosition],2
  PUSH   dword [v_a]
  PUSH   dword 0
  MOV    edx,[PB_StringBase]
  ADD    [esp+8],edx
  CALL _PB_AddGadgetItem3@20
  POP    dword [_PB_StringBasePosition]
; b1:
l_b1:
; AddGadgetItem (#tree, a, ""+a, 0, 1)
  PUSH   dword [_PB_StringBasePosition]
  PUSH   dword 1
  PUSH   dword 0
  PUSH   dword [_PB_StringBasePosition]
 
вот тут дополнительная вставка кода, а значит и время
MOV    edx,_S3
PUSH   edx
CALL _SYS_CopyString@4
MOV    edx,[_PB_StringBasePosition]
 
 
  PUSH   edx
  PUSH   edx
  MOV    eax,dword [v_a]
  CDQ
  PUSH   edx
  PUSH   eax
  CALL _PB_Str_UNICODE@12
  POP    eax
  ADD    dword [_PB_StringBasePosition],2
  PUSH   dword [v_a]
  PUSH   dword 0
  MOV    edx,[PB_StringBase]
  ADD    [esp+8],edx
  CALL _PB_AddGadgetItem3@20
  POP    dword [_PB_StringBasePosition]
; b2:



AddGadgetItem (#tree, a, Str(a), 0, 1) дает 6,9 сек
AddGadgetItem (#tree, a, ""+a, 0, 1) дает 10,3 сек
Явного ускорения невидно, даж наоборот :roll: .
Такая запись невсегда удобна для понимания где у тебя ошибка, если непомниш всех этих заморочек.
Код:
1
2
3
4
5
6
a=4
a$="5"
s.s="22"
 
s=5 тут выдаст ошибку, и надо все это запоминать, где и какой тип
либо писать полностью s.s="22" вместо s="22", но так короче s$="22"


хотя у каждого свой стиль программирования

но так сокращая вечно какието ляпы вылазят, пурик не все может перевести
в удобочитаемый для АСМа код, вот и вываливается то что непонятно
Да и не все что дебуг воспринимает нормально в одних версия, нормально смотрит
в других косится, а про консоль так темболее, там любое одступление в сторону и началось :lol: .... ERR-лы всякие. И немож понять чего ему надобно.

newJS писал(а):
что за юмор с тормозами для TreeGadget

а ни кто и не обещал быструю винду :D[/quote]
Ну, я юмор понимаю :mrgreen: , но чегото все на других языках этим извращение непользуются у них есть для этого виртуалки :wink: , но что за списком команд на этих языках там стоит мне то как узнать :?: . И еще по поводу винды, хоть вроде и винда, но быстрые контролы мало кто делает, вот както обхитрить то да.
Прикинь какуюто базу даных в которой сотни итемов и пользователь будет ждать до пенсии пока это загрузится, скорее пользователь откажется од такой проги... :| .
К слову помнишь тема про быстрое соединение строк, так оказалось, что пурик, прежде чем дописать в конец строки текст он ищет командой ЛЕН(или лень :lol: ) этот конец и тогда вставляет. И когда строка длинная и вставлять так не один раз приходится то и заждый раз искать конец строки это занимает время, и оказалось что из 21 секунд это почти 5 секунд на поиски конца, ну еще чегото там к этому прибавить кроме копирования типа вычисления... вот и тормоза. Конечно это гарантирует то что если ктото изменит строку прямо и прога небудет это знать и вставит по указателю, то на выходе будет испорчено все. Так что Фред пошел путем гарантии, хоть и тормоз.

Вот я давал для табличного гаджета(не зря же он называется ГАД-жетом, гадом каких-то джетов :) ), так там скорость отображения супер быстрая.
И мне ктото код давал для редактора, тоже мгновенно отображается.
Думаю только нужно немного голову поломать и над этим и будет нам счастъе.
Я пробовал с инета всякие самодельные, кроме одного, ну там кода не мерено.
Да и тестировать надо.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт ноя 06, 2018 8:15 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Вот выкопал и перекопал до мизера такой код по созданию на АПИ итемов
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
Procedure TVAddItem(gadget.l, position.l, text.s, hImg.l, openflag.l)
  ;
  ; Insert a Item in a TreeView Gadget.
  ; not like AddGadgetItem(), this one supports the position parameter.
  ;
  ; Usage:
  ;***********
  ; gadget.l   = PB Gadget Number
  ; position.l = Item to insert the new one after (starting with 0)
  ; text.s     = Item Text
  ; hImg.l     = ImageID if Image to display
  ; openflag.l = If #TRUE, a new TreeViewNode is created at 'position.l' and the new Item
  ;              is added as it's Child, if #FALSE, the new one is just inserted after the 'position.l'
  ;              Item.
  ;
  ; Note: The hImg.l parameter is only supported, if there are allready some Items with Images.
  ;
  hwndTV.l = GadgetID(gadget)
  hRoot.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
  hItem = hRoot: hParent.l = 0
  For i.l = 0 To position-1
    hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
    Repeat
      If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
      If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
    Until hItem2 <> #Null
    hItem = hItem2
  Next i
  lpis.TVINSERTSTRUCT
 
  If openflag = #True
    pitem.TVITEM
    pitem\mask = #TVIF_CHILDREN | #TVIF_HANDLE
    pitem\hItem = hItem
    pitem\cChildren = 1
    SendMessage_(hwndTV, #TVM_SETITEM, 0, @pitem)
    lpis\hParent = hItem
    lpis\hInsertAfter = hItem
  Else
    lpis\hParent = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
    lpis\hInsertAfter = hItem
  EndIf
  lpis\item\mask = #TVIF_TEXT
  If hImg <> 0
    himl.l = SendMessage_(hwndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL ,0)
    If himl <> #Null
      lpis\item\mask | #TVIF_IMAGE
      iImage.l = ImageList_AddIcon_(himl, hImg)
      lpis\item\iImage = iImage
      lpis\item\iSelectedImage = iImage
    EndIf
  EndIf
  lpis\item\cchTextMax = Len(text)
  lpis\item\pszText = @text
  SendMessage_(hwndTV, #TVM_INSERTITEM, 0, @lpis)
EndProcedure
 
 
Procedure TVDeleteItem(gadget.l, item.l)
  ;
  ; Deletes a TreeViewItem.
  ;
  ;Usage:
  ;**************
  ; gadget.l  = PB Gadget Number
  ; item.l    = Item to delete (starting with 0)
  ;
  hwndTV.l = GadgetID(gadget)
  hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
  For i.l = 0 To item-1
    hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
    Repeat
      If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
      If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
    Until hItem2 <> #Null
    hItem = hItem2
  Next i
  SendMessage_(hwndTV, #TVM_DELETEITEM, 0, hItem)  
EndProcedure
 
 
;- Example
If OpenWindow(0, 0, 0, 355, 200, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)
   For a = 0 To 5
      AddGadgetItem (0, -1, "Elйment normal "+Str(a), 0, 0)
      AddGadgetItem (0, -1, "Noeud "+Str(a), 0, 0)
      AddGadgetItem (0, -1, "Sous-йlйment 1", 0, 1)
      AddGadgetItem (0, -1, "Sous-йlйment 2", 0, 1)
      AddGadgetItem (0, -1, "Sous-йlйment 3", 0, 1)
      AddGadgetItem (0, -1, "Sous-йlйment 4", 0, 1)
      AddGadgetItem (0, -1, "Fichier "+Str(a), 0, 0)
    Next
    ButtonGadget(1, 170,000,90,40,"TVAddItem")
    ButtonGadget(2, 170,040,90,40,"TVDeleteItem")
   
    t-ElapsedMilliseconds()
    For i=0 To 5000
        ;ТАК ЭТО ВИНДА ПРИКАЛЫВАЕТСЯ СО СКОРОСТЬЮ
        ;TVAddItem(0,5,"My Text "+Str(i),0, 1);1-1358 ИЛИ 5-1340 ОДИНАКОВО
        ;TVAddItem(0,Random(2,1),"My Text "+Str(i),0, 1);1130
        ;TVAddItem(0,Random(5,1),"My Text "+Str(i),0, 1);554
        ;TVAddItem(0,Random(10,1),"My Text "+Str(i),0, 1);402
        TVAddItem(0,Random(10,0),"My Text "+Str(i),0, 1);358
       
    Next
   
    Debug ElapsedMilliseconds()-t
  Repeat
    Event = WaitWindowEvent()
    If Event=#PB_Event_Gadget
      Select EventGadget()
          Case 1
              ;TVAddItem(gadget.l, position.l, text.s, hImg.l, openflag.l)openflag=0
              TVAddItem(0,0,"My Text By Button TVAddItem",0, 1)
          ; #true for OpenFlag add a child at the position's item
        Case 2
          TVDeleteItem(0,0)
 
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
 

в начале создает 5000 итемов и тут уже такие приколы со скоростями.
Причем если создавать поддиректории то быстрее,это когда указывать на родителя и ему присваивать подуровень.
но если в директории то медленей, причем четкой зависимости не видно.

Думаю что зависимость это когда он ищет итем который мне нужно и чем дальше в списке тем дольше создание ветки.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 07, 2018 12:17 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 654
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Может лучше покопать код быстрого что на делфи,ну или его в дллку как то запихать(если можно),и использовать? А то что винда притормаживает так там как я понимаю в функциях сидит код для обнаружения всяких ошибок и делает лишние проверки(типа lasterror)? :roll:
Вынь из процедуры
Код:
1
2
3
 
hwndTV.l = GadgetID(gadget)
 


Зачем каждый раз это делать когда можно единожды определить идентификатор гаджета с которым работаешь. :roll:
или вообще сделать глобальную переменную и не гнать каждый раз параметр через стек.(в dll это было бы невидимо(установил раз и забыл на время работы с ним)). :D
Может и со структурой также(не вникал). :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 07, 2018 8:33 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 777
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 12 раз.
Пункты репутации: 0
А вы с ним пробовали?
https://www.purebasic.fr/english/viewtopic.php?f=12&t=71123&p=527139#p527139
Для меня работает очень быстро.))))


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 07, 2018 12:12 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Сергейчик по поводу стека и входов в процедуры я сильно невникал.
Переполнения теканет ну и ладно. :)
Да и все процедуры и функции передают параметры через стек+CALL, ну вобщем ты лучше меня знаеш.

По вопросу GadgetID(gadget) надо попробовать, иногда легчает.
Но скорее всего несильно, потому что на Делфи и СИ сделан для этого виртуальный гаджет.

Цитата:
Может и со структурой также(не вникал)
Там в структуре задаются параметры которые гаджет контрол запрашивает и сократить как понимаеш не получится, там и так мизер.
Есть вариант, в масив загнать индификаторы и суб-уровни, так быстрее перебирать чем каждый раз вызывать SendMessage_, особенно как у автора.
Я пользуюсь разобратой процедурой и у меня этого цикла нету как у него у меня не номер пункта а выделеный итем является исходным, думаю это быстрее :roll: , хотя насмотрелся всего уже, даже сомнения по всякому поводу берут...

По поводу переделать с Делфи, это если кто нормально понимает как это перевести и сделать с примерами на пурике. Вот вырезка теста скоростей, впечатляет :D , особенно для 486 проца :lol: .

Стандартный TreeView:
128 сек. для загрузки 1000 элементов (без сортировки)*
270 сек. для сохранения 1000 элементов (4.5 минуты!!!)

HETreeView:
1.5 сек. для загрузки 1000 элементов – ускорение около 850%!!! (2.3 секунды без сортировки = stText)* (У меня столько времени тратится на 5000 итемов, так проц то 2ГГц, в 60 раз быстрее, глазом неморгнеш и нарисовано, надеюсь :roll: )
0.7 сек. для сохранения 1000 элементов – ускорение около 3850%!!!

Примечание:
• Все операции выполнялись на медленной машине 486SX 33 Mгц, 20 Mб RAM.
(И ЭТО НА САМОЙ КРУТОЙ 8 ЯДЕРНОЙ МАШИНЕ :lol: , шутка )

код на двух сайтах(мне он попался в типа журнальчике електронном, нашел в инете через гугл)
http://programming-lang.com/ru/comp_pro ... 0/j92.html
ту правда его нужно искать по словам Tree, там сразу несколько
http://litresp.ru/chitat/ru/О/ozerov-valentin/soveti-po-delphi-versiya-106/10
http://delphiworld.narod.ru/base/fast_treeview.html

ниже сам код, когдато искал и сохранил, хотя есть сайты, если гдето ошибка:
"Ускорение работы TreeView"
http://programming-lang.com/ru/comp_programming/ozerov/0/j92.html

Представляем вашему вниманию немного переработанный компонент TreeView, работающий быстрее своего собрата из стандартной поставки Delphi. Кроме того, была добавлена возможность вывода текста узлов и пунктов в жирном начертании (были использованы методы TreeView, хотя, по идее, необходимы были свойства TreeNode. Мне показалось, что это будет удобнее).

Для сравнения:

TreeView:

128 сек. для загрузки 1000 элементов (без сортировки)*

270 сек. для сохранения 1000 элементов (4.5 минуты!!!)

HETreeView:

1.5 сек. для загрузки 1000 элементов – ускорение около 850%!!! (2.3 секунды без сортировки = stText)*

0.7 сек. для сохранения 1000 элементов – ускорение около 3850%!!!

Примечание:

• Все операции выполнялись на медленной машине 486SX 33 Mгц, 20 Mб RAM.

• Если TreeView пуст, загрузка происходит за 1.5 секунды, плюс 1.5 секунды на стирание 1000 элементов (общее время загрузки составило 3 секунды). В этих условиях стандартный компонент TTreeView показал общее время 129.5 секунд. Очистка компонента осуществлялась вызовом функции SendMessage(hwnd, TVM_DELETEITEM, 0, Longint(TVI_ROOT)).

Проведите несколько приятных минут, развлекаясь с компонентом.

unit HETreeView;

{$R-}

// Описание: Реактивный TreeView

(*

TREEVIEW:

128 сек. для загрузки 1000 элементов (без сортировки)*

270 сек. для сохранения 1000 элементов (4.5 минуты!!!)

HETREEVIEW:

1.5 сек. для загрузки 1000 элементов – ускорение около 850%!!! (2.3 секунды без сортировки = stText)*

0.7 сек. для сохранения 1000 элементов – ускорение около 3850%!!!

NOTES:

– Все операции выполнялись на медленной машине 486SX 33 Mгц, 20 Mб RAM.

– * Если TTreeView пуст, загрузка происходит за 1.5 секунды,

плюс 1.5 секунды на стирание 1000 элементов (общее время загрузки составило 3 секунды).

В этих условиях стандартный компонент TreeView показал общее время 129.5 секунд.

Очистка компонента осуществлялась вызовом функции

SendMessage(hwnd, TVM_DELETEITEM, 0, Longint(TVI_ROOT)).

*)

interface

uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, CommCtrl, tree2vw;

type THETreeView = class(TTreeView)

private

FSortType: TSortType;

procedure SetSortType(Value: TSortType);

protected

function GetItemText(ANode: TTreeNode): string;

public

constructor Create(AOwner: TComponent); override;

function AlphaSort: Boolean;

function CustomSort(SortProc: TTVCompare; Data: Longint): Boolean;

procedure LoadFromFile(const AFileName: string);

procedure SaveToFile(const AFileName: string);

procedure GetItemList(AList: TStrings);

procedure SetItemList(AList: TStrings);

//Жирное начертание шрифта 'Bold' должно быть свойством TTreeNode, но...

function IsItemBold(ANode: TTreeNode): Boolean;

procedure SetItemBold(ANode: TTreeNode; Value: Boolean);

published

property SortType: TSortType read FSortType write SetSortType default stNone;

end;

procedure Register;

implementation

function DefaultTreeViewSort(Node1, Node2: TTreeNode; lParam: Integer): Integer; stdcall;

begin

{with Node1 do

if Assigned(TreeView.OnCompare) then

TreeView.OnCompare(Node1.TreeView, Node1, Node2, lParam, Result)

else}

Result:= lstrcmp(PChar(Node1.Text), PChar(Node2.Text));

end;

constructor THETreeView.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

FSortType:= stNone;

end;

procedure THETreeView.SetItemBold(ANode: TTreeNode; Value: Boolean);

var

Item: TTVItem; Template: Integer;

begin

if ANode = nil then Exit;

if Value then Template:= -1 else Template:= 0;

with Item do begin

mask:= TVIF_STATE;

hItem:= ANode.ItemId;

stateMask:= TVIS_BOLD;

state:= stateMask and template;

end;

TreeView_SetItem(Handle, Item);

end;

function THETreeView.IsItemBold(ANode: TTreeNode): Boolean;

var

Item: TTVItem;

begin

Result:= False;

if ANode = nil then Exit;

with Item do begin

mask:= TVIF_STATE;

hItem:= ANode.ItemId;

if TreeView_GetItem(Handle, Item) then Result:= (state and TVIS_BOLD) <> 0;

end;

end;

procedure THETreeView.SetSortType(Value: TSortType);

begin

if SortType <> Value then begin

FSortType:= Value;

if ((SortType in [stData, stBoth]) and Assigned(OnCompare)) or (SortType in [stText, stBoth]) then AlphaSort;

end;

end;

procedure THETreeView.LoadFromFile(const AFileName: string);

var

AList: TStringList;

begin

AList:= TStringList.Create;

Items.BeginUpdate;

try

AList.LoadFromFile(AFileName);

SetItemList(AList);

finally

Items.EndUpdate;

AList.Free;

end;

end;

procedure THETreeView.SaveToFile(const AFileName: string);

var

AList: TStringList;

begin

AList:= TStringList.Create;

try

GetItemList(AList);

AList.SaveToFile(AFileName);

finally

AList.Free;

end;

end;

procedure THETreeView.SetItemList(AList: TStrings);

var

ALevel, AOldLevel, i, Cnt: Integer;

S: string;

ANewStr: string;

AParentNode: TTreeNode;

TmpSort: TSortType;

function GetBufStart(Buffer: PChar; var ALevel: Integer): PChar;

begin

ALevel:= 0;

while Buffer^ in [' ', #9] do begin

Inc(Buffer);

Inc(ALevel);

end;

Result:= Buffer;

end;

begin

//Удаление всех элементов – в обычной ситуации подошло бы Items.Clear, но уж очень медленно

SendMessage(handle, TVM_DELETEITEM, 0, Longint(TVI_ROOT));

AOldLevel:= 0;

AParentNode:= nil;

//Снятие флага сортировки

TmpSort:= SortType;

SortType:= stNone;

try

for Cnt := 0 to AList.Count-1 do begin

S:= AList[Cnt];

if (length(s) = 1) and (s[1] = chr($1a)) then break;

ANewStr:= GetBufStart(PChar(S), ALevel);

if (ALevel > AOldLevel) or (AParentNode = nil) then begin

if ALevel - AOldLevel > 1 then raise Exception.Create('Неверный уровень TreeNode');

end else begin

for i:= AOldLevel downto ALevel do begin

AParentNode:= AParentNode.Parent;

if (AParentNode = nil) and (i - ALevel > 0) then raise Exception.Create('Неверный уровень TreeNode');

end;

end;

AParentNode:= Items.AddChild(AParentNode, ANewStr);

AOldLevel:= ALevel;

end;

finally

//Возвращаем исходный флаг сортировки…

SortType:= TmpSort;

end;

end;

procedure THETreeView.GetItemList(AList: TStrings);

var

i, Cnt: integer;

ANode: TTreeNode;

begin

AList.Clear;

Cnt:= Items.Count -1;

ANode:= Items.GetFirstNode;

for i:= 0 to Cnt do begin

AList.Add(GetItemText(ANode));

ANode:= ANode.GetNext;

end;

end;

function THETreeView.GetItemText(ANode: TTreeNode): string;

begin

Result:= StringOfChar(' ', ANode.Level) + ANode.Text;

end;

function THETreeView.AlphaSort: Boolean;

var

I: Integer;

begin

if HandleAllocated then begin

Result:= CustomSort(nil, 0);

end else Result:= False;

end;

function eView.CustomSort(SortProc: TTVCompare; Data: Longint): Boolean;

var

SortCB: TTVSortCB;

I: Integer;

Node: TTreeNode;

begin

Result:= False;

if HandleAllocated then begin

with SortCB do begin

if not Assigned(SortProc) then lpfnCompare:= @DefaultTreeViewSort

else lpfnCompare:= SortProc;

hParent:= TVI_ROOT;

lParam:= Data;

Result:= TreeView_SortChildrenCB(Handle, SortCB, 0);

end;

if Items.Count > 0 then begin

Node:= Items.GetFirstNode;

while Node <> nil do begin

if Node.HasChildren then Node.CustomSort(SortProc, Data);

Node:= Node.GetNext;

end;

end;

end;

end;

//Регистрация компонента

procedure Register;

begin

RegisterComponents('Win95', [THETreeView]);

end;

end.

Разное

Создание компонента во время работы приложения

Var

MyButton: TButton;

MyButton:= TButton.Create(MyForm); // MyForm теперь "обладает" MyButton

with MyButton do BEGIN

Parent:= MyForm; // Выбираем родителей. MyForm "усыновляет" MyButton

height:= 32;

width:= 128;

caption:= 'Я здесь!';

left := (MyForm.ClientWidth – width) div 2;

top := (MyForm.ClientHeight – height) div 2;

END;

Inprise также рассказывала об этом в выпусках TechInfo.

Поищите

ti2938.asc Creating Dynamic Components at Runtime

на публичном WWW или FTP сайте компании Inprise.

Получение индекса компонента в списке родителя

Мне необходимо найти индекс компонента в родительском списке дочерних элементов управления. Я попытался модифицировать prjexp.dll, но без успеха. У кого-нибудь есть идеи?

Есть такая функция. Ищет родителя заданного компонента, перебирает список и возвращает индекс искомого компонента. Функция прошла многочисленные тесты и вполне работоспособна.

{ функция, возвращающая индекс искомого компонента в

списке родителя; возвращает –1 при отсутствии компонента }

function IndexInParent(vControl: TControl): integer;

var

ParentControl: TWinControl;

begin

{делаем "слепок" родителя через базовый класс на предмет доступности }

ParentControl:= TForm(vControl.Parent);

if (ParentControl <> nil) then begin

for Result:= 0 to ParentControl.ControlCount - 1 do begin

if (ParentControl.Controls[Result] = vControl) then exit;

end;

end;

{ если мы уж попали в это место, то либо не найден компонент, либо компонент не имел родителя }

Result:= –1;

end;

Массив компонентов…

Возможно ли создание массива компонентов? Для показа статуса я использую набор LED-компонентов и хотел бы иметь к ним доступ, используя массив.

Прежде всего необходимо объявить массив:

LED: array[1..10] of TLed; (10 элементов компонентного типа TLed)

При необходимости динамического создания LED-компонентов организуйте цикл, пример которого мы приводим ниже:

for counter:= 1 to 10 do begin

LED[counter]:= TLED.Create;

LED[counter].top:= …

LED[counter].Left:= …

LED[counter].Parent:= Mainform; {что-то типа этого}

end;

Если компоненты уже присутствуют на форме (в режиме проектирования), сделайте их элементами массива, например так:

leds:= 0;

for counter:= 0 to Form.Componentcount do begin

if (components[counter] is TLED) then begin

inc(leds);

LED[leds]:= TLED(components[counter]);

end

end;

Тем не менее у нас получился массив со случайным расположением LED-компонентов. Я предлагаю назначить свойству Tag каждого LED-компонента порядковый номер его расположения в массиве, а затем заполнить массив, используя это свойство:

for counter := 0 to Form.Componentcount do begin

if (components[counter] is TLED) then begin

LED[Component[counter].tag]:= TLED(components[counter]);

end

end;

Если вам нужен двухмерный массив, то для формирования индекса понадобится другая хитрость, например, хранение в свойстве Hint информации о времени создания компонентов.
================================
Тут вот
http://www.sql.ru/forum/131670/postroen ... ntov-50000
решался вопрос:Построение TreeView с кол-вом элементов 50000?
Мне столько ненужно, точнее это максимум, но если перетащить кудато ветку мышкой и ждать обалденное количесво секунд, никуда негодится. Както видел на пурике ктото сделал со структурами и на листах, так переместить только кнопкой 500 несчастных итемов занимает десятки сек, ого скорость говорю, чего он там налепил, будет быстрее прямым способом работать.

Вобщем на этом фаруме такое написано в ответах:
А тут есть ссылка на этот компонент который привел можно еще и тут скачать, смотрел он похож на мой http://www.delphi-gems.com/

Есть такой компонент HETreeView. По словам разработчика в сотни раз быстрее стандартного. Сам не проверял, но пользуюсь. Вроде быстро. См. прикрепленный файл.

А TTreeView с большим числом элементов и "умирает" долго, если все подвязанные объекты убивать. Юзай TVirtualTreeView - шустрая, и множество проблем решено.

================================
Для меня на делфи например это TreeView.Items.Add(nil, 'Узел'); похоже на работу со скриптами для екселя, или чемто напоминает на работу с интерфейсами.

========================
Я думал как реализовано перемещение веток, может оно в АПИ реализовано, но там ничего нет.
Оказалось, что только так :lol: :
http://netcode.ru/cpp/?lang=&katID=23&s ... artID=5355
Перемещение элемента или ветви / TreeCtrl, TreeView / Элементы управления

Перемещение элемента или ветви есть последовательная операция копирования с помощью CopyItem() / CopyBranch() и удаления: функция DeleteItem(). Заметьте, что при удалении ветви удаляются и все принадлежащие ей отростки.
И это даже на виртуальном, но там это делается процедурой, причем так готовый компонент ктороый подключил и пользуйся, а тут головная боль пока что с этим, подключать то нечего :roll: .

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 07, 2018 12:28 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
mestnyi писал(а):
А вы с ним пробовали?
https://www.purebasic.fr/english/viewtopic.php?f=12&t=71123&p=527139#p527139
Для меня работает очень быстро.))))

Я так понял что это какойто модуль, ну это так меня отругал пурик, я в этом ни бум-бум(в модулях).
Смотрел выше говорит про файлик module_scroll.pbi, у себя искал на всех винтах, такого незавалялось.
Где скачать?
Что делает?
Разбираться с тем, что имеет вес 52 кило и 1500 строчек и это без этого модуля, Хм, както интерес пропадет даже у интузиастов, особенно на инглише и без пояснений что и чего делает :| .

Да и как модуль может помочь, я непойму, что за секрет :?:

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 07, 2018 1:38 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
balex1978 писал(а):
Смотрел выше говорит про файлик module_scroll.pbi, у себя искал на всех винтах, такого незавалялось.Где скачать?
В первом сообщении есть ссылка. https://www.purebasic.fr/english/viewto ... 12&t=71123

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB