Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.007 c
3-1205422412
Цукор5
2008-03-13 18:33
2008.09.07
OLE и FireBird


15-1216176501
Slider007
2008-07-16 06:48
2008.09.07
С днем рождения ! 16 июля 2008 среда


2-1217151979
ванъка
2008-07-27 13:46
2008.09.07
TImageList


2-1217169031
AlexanderMS
2008-07-27 18:30
2008.09.07
Процедура, вызываемая при ошибке в программе.


2-1217146595
Newser
2008-07-27 12:16
2008.09.07
Как найти фрагмент текста (дата)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский