Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Разбор кода подсчета трафика   Найти похожие ветки 

 
ketmar ©   (2008-07-08 15:54) [40]

>[39] AlexKniga © (2008-07-08 15:52:00)
а, ну да. tnx. провтыкал, должен был сам адрес дать. %-)

---
Understanding is not required. Only obedience.


 
wl ©   (2008-07-08 15:55) [41]


> ketmar ©   (08.07.08 15:47) [38]

а код похоже на чистом С, там вроде не было new


 
ob_kun   (2008-07-08 15:58) [42]

Еще один вопрос: насколько я разобрался в коде, там идет показание параметров соединений только один раз. Стоит так и оставить таймер для обновления данных?


 
ketmar ©   (2008-07-08 15:58) [43]

>[41] wl © (2008-07-08 15:55:00)
>а код похоже на чистом С

неа. цпп. в чистом C можно void * присваивать любому указателю, а цпп это запрещает. отсюда там приведение типа.

---
Do what thou wilt shall be the whole of the Law.


 
ketmar ©   (2008-07-08 15:59) [44]

>[42] ob_kun (2008-07-08 15:58:00)
а это тебе видней. там же не готовая софтина, там просто пример правильного использования API.

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-08 16:34) [45]

ketmar, а как понять вашу фразу про "локальную переменную"? Все переменные, использующиеся в var внутри Timer1Timer, перенести в private у формы?


 
ketmar ©   (2008-07-08 16:52) [46]

>[45] ob_kun (2008-07-08 16:34:00)
зачем же все? только буфер с результатом.

зыж я тут один, лучше на ты.

---
All Your Base Are Belong to Us


 
ketmar ©   (2008-07-08 16:53) [47]

>[45] ob_kun (2008-07-08 16:34:00)
точнее, буфер и его размер.

---
Understanding is not required. Only obedience.


 
ob_kun   (2008-07-08 16:57) [48]

То, что обозначено как pIfTable и dwSize в указанном тобой примере?


 
ketmar ©   (2008-07-08 17:06) [49]

>[48] ob_kun (2008-07-08 16:57:00)
угу. с достаточно большой вероятностью они после первого «устаканивания» размера изменяться не будут, зачем каждый раз создавать и уничтожать буфер? это имеет смысл, если функция вызывается один раз, а если по таймеру — никакого смысла нет. вообще, вызов GetIfTable() вместе с "устаканиванием" есть смысл вытащить в отдельный метод, нечего обработчик захламлять деталями. да и обновление списка тоже. пусть в обработчике останется нечто типа:

GetIfInfo();
UpdateIfList();

и хватит.

зыж pdwSize (какой, всё-таки, идиот их научил понимать венгерскую нотацию так…)

---
Understanding is not required. Only obedience.


 
ob_kun   (2008-07-08 17:08) [50]

Извини, я написал простой код, он чисто показать, как я понял переписывание функции, можешь посмотреть, если сюда напишу?


 
ob_kun   (2008-07-08 17:12) [51]

procedure TForm2.tmrTimer(Sender: TObject);
var
dwSize : DWORD;
dwRetVal : DWORD;
i, j : Integer;
pIfTable : PMibIfTable;
pIfRow :  PMibIfRow; // pIfTable и dwSize вынесу позже в private
begin
 New(pIfTable);
 if pIfTable = Nil then exit;
 dwSize := sizeOf(TMibIfTable);
 if GetIfTable(pIfTable, @dwSize, False) = ERROR_INSUFFICIENT_BUFFER then
 begin
   Dispose(pIfTable);
   GetMem(pIfTable, dwSize);  // иначе будет как-то глупо вновь писать New(pIfTable)
   if pIfTable = Nil then exit;
 end;
 dwRetVal := GetIfTable(pIfTable, @dwSize, False);
 if dwRetVal <> NO_ERROR then exit;
   for i := 0  to pIfTable.dwNumEntries-1 do
   begin
     if not Flag then begin
       with lv.Items.Add do
       begin
         Caption := Trim(IntToStr(pIfTable.Table[i].dwIndex)+" "+pIfTable.Table[i].bDescr);
         // а тут дальнейшее заполнение
       end;
     end;
   end;
   if not Flag then Flag := True;
end;


 
ketmar ©   (2008-07-08 17:12) [52]

>[50] ob_kun (2008-07-08 17:08:00)
посмотреть могу. и не только я. %-) я тут далеко не самый умный.

---
Do what thou wilt shall be the whole of the Law.


 
ob_kun   (2008-07-08 17:16) [53]

Ну вот, собственно, мой убогий сорец ;)


 
ketmar ©   (2008-07-08 17:17) [54]

>[51] ob_kun (2008-07-08 17:12:00)
не совсем так. а точнее, совсем не так. ну, проверки пока опустим, фиг с ними. ты про обновление списка не понял.

смотри, после первого вызова у тебя уже есть заполненый список. при повторном вызове надо (грубо, можно умнее, но это сейчас не важно) пройтись по списку и проверить, нет ли уже такого элемента в списке. почти наверняка он есть — вот тут достаточно обновить элемент, а не создавать новый. в первом варианте список чистился и заново заполнялся каждый раз — вот это лишнее. достаточно проверить, если ли уже в списке такой элемент и обновить только нужные поля. а вот если нет — тогда создать. а если остались элементы, которые на данном шаге не обновлялись — то их выкинуть.

ну, и BeginUpdate()/EndUpdate() нелохо бы, в виде той же косметики.

---
Do what thou wilt shall be the whole of the Law.


 
ketmar ©   (2008-07-08 17:20) [55]

>[51] ob_kun (2008-07-08 17:12:00)
т.е. "в лоб" нечто вроде:

foreach ifItem in pIfTable do
 if IsItemInList(ifItem) then ОбновитьЭлементИОтметитьКакОбновлённый();
 else ДобавитьЭлементИОтметитьКакОбновлённый();
 end;
end;
...
foreach liItem in list do
 if НеОтмеченКакОбновлённый(liItem) then УдлалитьИзСписка(liItem); end;
end;

думаю, псевдокод понятен? %-)

---
Do what thou wilt shall be the whole of the Law.


 
ob_kun   (2008-07-08 17:23) [56]

Да нет, это как раз я понял. Я уже дописал вариант, но он падает, взгляни: (SubItems[3] - это скорость)


procedure TForm2.tmrTimer(Sender: TObject);
var
dwSize : DWORD;
dwRetVal : DWORD;
i, j : Integer;
pIfTable : PMibIfTable;
pIfRow :  PMibIfRow; // pIfTable и dwSize вынесу позже в private
begin
 New(pIfTable);
 if pIfTable = Nil then exit;
 dwSize := sizeOf(TMibIfTable);
 if GetIfTable(pIfTable, @dwSize, False) = ERROR_INSUFFICIENT_BUFFER then
 begin
   Dispose(pIfTable);
   GetMem(pIfTable, dwSize);  // иначе будет как-то глупо вновь писать New(pIfTable)
   if pIfTable = Nil then exit;
 end;
 dwRetVal := GetIfTable(pIfTable, @dwSize, False);
 if dwRetVal <> NO_ERROR then exit;
   for i := 0  to pIfTable.dwNumEntries-1 do
   begin
     if not Flag then begin
       with lv.Items.Add do
       begin
         Caption := Trim(pIfTable.Table[i].bDescr);
         // а тут дальнейшее заполнение
         SubItems.Add("");
         SubItems.Add("");
         SubItems.Add(SpeedToStr(pIfTable.Table[i].dwSpeed));
       end;
     end
     else
     begin
       for j := 0 to pIfTable.dwNumEntries-1 do
       begin
         if Trim(pIfTable.Table[j].bDescr)=lv.Items[j].Caption then
         begin
           lv.Items[j].SubItems[3] := SpeedToStr(pIfTable.Table[i].dwSpeed);
           exit;
         end;
       end;
     end;
   end;
   if not Flag then Flag := True;
end;


 
ob_kun   (2008-07-08 17:30) [57]

Подправил ошибки, но все равно бага.... правлю...


 
ketmar ©   (2008-07-08 17:31) [58]

>[56] ob_kun (2008-07-08 17:23:00)
зачем тебе Flag? процесс заполнения/изменения списка абсолютно не зависит от того, вызвали ли его в первый раз или в сотый. в первый раз ветка «если ли уже всписке» просто всегда будет возвращать false — и что? пусть себе. алгоритм не меняется.

алсо, с чего ты решил, что pIfTable.dwNumEntries и lv.Items.Count равны? это никак не гарантируется, нет такого обещания.

почитай мой псевдокод внимательней, он совсем не то, что ты написал.

---
All Your Base Are Belong to Us


 
ketmar ©   (2008-07-08 17:32) [59]

>[57] ob_kun (2008-07-08 17:30:00)
бага для начала в логике.

---
Understanding is not required. Only obedience.


 
ob_kun   (2008-07-08 17:35) [60]

Так и есть, убедился эмпирически сейчас ;)

> ОбновитьЭлементИОтметитьКакОбновлённый();

как понять - отметить как обновленный?


 
ob_kun   (2008-07-08 17:36) [61]

foreach ifItem in pIfTable do

и откуда взялось ifItem?


 
ob_kun   (2008-07-08 17:47) [62]

Кроме того, не совсем ясна твоя логика: смотри, вот у нас список
1    5
2    300
3    44

и если 1 есть, то обновим его и пометим как обновленный, если, скажем, 4 нету, то добавим и пометим как обновленный. А откуда ж тогда возьмутся необновленные?


 
ketmar ©   (2008-07-08 17:53) [63]

>[60] ob_kun (2008-07-08 17:35:00)
>как понять — отметить как обновленный?

у каждого элемента свой флажок «меня на этой итерации трогали».

>[61] ob_kun (2008-07-08 17:36:00)
>и откуда взялось ifItem?

это переменная-итератор. в данном смысле конструкция foreach примерно так раскрывается:

var
 a: array [1..10] of Integer;
 item: Integer;
 cnt: Integer;

//foreach item in a do это:
for cnt := 0 to High(a) do
 item := a[cnt];
 ….
end;


>[62] ob_kun (2008-07-08 17:47:00)
>А откуда ж тогда возьмутся необновленные?

пришёл марсианец и украл один сетевой интерфейс.

---
Do what thou wilt shall be the whole of the Law.


 
ob_kun   (2008-07-08 17:56) [64]


> у каждого элемента свой флажок «меня на этой итерации трогали».

а флажок этот как реализуется?

> это переменная-итератор.

а тип у нее какой?
> пришёл марсианец и украл один сетевой интерфейс.

вот заразна душа)


 
ob_kun   (2008-07-08 17:59) [65]


> а флажок этот как реализуется?

неужто придется вводить доп лист, индексы которого соответствуют индексам в ListView?


 
ketmar ©   (2008-07-08 18:00) [66]

>[64] ob_kun (2008-07-08 17:56:00)
>а флажок этот как реализуется?

как программист захочет. главное, чтобы с каждым элементом был чётко связан свой флажок.

>а тип у нее какой?
посмотри на мой код-расшифровку внимательно.

>вот заразна душа)
— Цан, извини, а вот такие, с хоботками, это кто? — спросил Гедеван.
— Никто. Фитюльки.
— В каком смысле?
— Во всех. Болтают, что они тут раньше, до плюкан жили.  Но это так… Треп.


---
All Your Base Are Belong to Us


 
ketmar ©   (2008-07-08 18:01) [67]

>[65] ob_kun (2008-07-08 17:59:00)
>неужто придется вводить доп лист, индексы которого соответствуют индексам в
>ListView?

у item есть чудное свойство data.

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-08 18:06) [68]


> посмотри на мой код-расшифровку внимательно.

такое чувство, что коли все типа Integer, а pIfTable типа PMibIfTable, то и ifItem должна быть типа PMibIfTable ))))


 
ob_kun   (2008-07-08 18:10) [69]

Свойство это типа Pointer, а как его припихнуть, на что сослаться - тоже вопрос....

a = 1; // отмечен
lv.Items[0].Data := @a;

?


 
ob_kun   (2008-07-08 18:12) [70]

Или просто

lv.Items[0].Data := Pointer(1);

...

lv.Items[1].Data := Pointer(0);

?


 
ketmar ©   (2008-07-08 18:25) [71]

>[70] ob_kun (2008-07-08 18:12:00)
вот это мысль верная. %-)

>[68] ob_kun (2008-07-08 18:06:00)
>такое чувство, что коли все типа Integer, а pIfTable типа PMibIfTable, то и ifItem
>должна быть типа PMibIfTable ))))

это потому, что в Delphi нет foreach. точнее, не было. %-) вот и непривычно. ничего, потом пригодится когда-нибудь.

---
Understanding is not required. Only obedience.


 
ob_kun   (2008-07-08 23:42) [72]

Так по поводу типа ifItem я верно угадал???


 
ob_kun   (2008-07-09 12:58) [73]

Я просто не совсем понимаю, как переложить аналогию с массивом на структуру.


 
ketmar ©   (2008-07-09 13:50) [74]

>[73] ob_kun (2008-07-09 12:58:00)
да пофигу. первый цикл у тебя верный, оставь тот псевдокод. я просто твой цикл короче переписал, потому что ленивый.

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-09 14:01) [75]

Ты имеешь ввиду, оставить for i := 0  to pIfTable.dwNumEntries-1 do
  begin
....

?


 
ketmar ©   (2008-07-09 14:05) [76]

>[75] ob_kun (2008-07-09 14:01:00)
угу. это и есть foreach, только выраженый более многословно. %-)

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-09 23:34) [77]

Завтра постараюсь написать процедуру в более-менее нормальном варианте. Остался еще вопрос - как ты представляешь себе, что суть процедура IsItemInList ? Как она должна осуществлять поиск элемента? По имени интерфейса (добавить отображение wszName) ?


 
ketmar ©   (2008-07-10 13:08) [78]

>[77] ob_kun (2008-07-09 23:34:00)
да хоть и так. или по адресу, например.

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-10 13:35) [79]

А есть какая-то возможность, чтобы поля в ListView были, но их не было видно? Или стоит просто писать в Tag у элементов первой колонки значение wszName?


 
ketmar ©   (2008-07-10 14:18) [80]

>[79] ob_kun (2008-07-10 13:35:00)
а зачем ты вообще к полям привязался? у тебя вон целый pointer на что угодно без дела простаивает.

---
All Your Base Are Belong to Us



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.016 c
15-1216283532
Petr V. Abramov
2008-07-17 12:32
2008.09.07
qip и русские буквы


15-1216122640
denic
2008-07-15 15:50
2008.09.07
AVR + LCD


2-1217313439
Ilg
2008-07-29 10:37
2008.09.07
Удаление папки, содержащей БД


15-1216208559
РВА
2008-07-16 15:42
2008.09.07
Интересный день сегодня...


2-1217326915
wsv
2008-07-29 14:21
2008.09.07
ADOConnection и его ConnectionTimeout