Data Parseleme;

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Data Parseleme;

Mesaj gönderen G.Arkas »

Merhabalar.İnternet cafe yazılımımda sona yaklaşırken garip bir sorunla karşı karşıyayım.

Socket ile gönderdiğim veri

Kod: Tümünü seç

function GetWindows(hWnd:HWND; lParam:boolean):boolean;stdcall;
var
IsVis:    boolean;
PID:      DWORD;
sName:    array[0..256] of char;
c:integer;
begin
IsVis   := IsWindowVisible(hWnd);
GetWindowText(hWnd, sName, 256);
GetWindowThreadProcessId(hWnd, PID);
if IsVis = lParam then
client.Socket.SendText('wnds|' + sName + '|' + IntToStr(hWnd) + '|' + IntToStr(PID) + '|' + GetWindowState(hWnd));
end
Değişkenler

Kod: Tümünü seç

  sData: String;
  sCmd: String;
  sDat: TStringList;
  lw: TListItem;

Karşılayıp parseleme yaptığım yer.(server)

Kod: Tümünü seç

begin
  sData := Socket.ReceiveText;
  sDat := Explode('|', sData);
  sCmd := sDat[0];
  iReceived := iReceived + Length(sData);

Listeye ekleme bölümü

Kod: Tümünü seç

if sCmd='wnds' then
  begin
  lw:=frmwindws.lvWindows.items.add;
  lw.Caption:=sdat[1];
  lw.SubItems.Add(sdat[2]);
  lw.SubItems.Add(sdat[3]);
  lw.SubItems.Add(sdat[4]);
Listeye ekleme proceduru eksik çalışıyor sadece 1 satır ekleniyor yani aktif olan tek pencere başlığı.
Halbuki aktif olan 7 pencere var çalışan.Ama sadece 1. si listeme ekleniyor bu neden olabilir sizce?

Aynı modülü çalışan uygulamarda (process list) yapıyorum sorunsuz hepsi ekleniyor.
Fikri olan arkadaşlarım yardımcı olabilirler mi?

İyi çalışmalar.
Resim
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Data Parseleme;

Mesaj gönderen emin_as »

Problemin oldugu noktayı tesbit etmek gerekiyor.
Aşagıdaki adımlara göre debug etmeyi dene.
* Program socket üzerinden 7 pencere bilgisini gönderiyor mu?
* Socket üzerindne bilgileri alan program 7 pencere bilgisini alabilmiş mi?
Eğer bu iki koşulda sorunsuz gerçekleşiyorsa, parse etme noktasına yönelmek gerekiyor veya listview.items.clear komutu gerektiginden fazla kullanılmış mı kontrol etmek gerekiyor.
Sanırım bilgileri döngü için yollayıp, parse ettiriyorsun. Bu döngülere de gözatmak gerekir.

Adım adım ilerlersen sorun çıkan noktayı bulabilirsin. Bazen olmaması gereken yerdeki clear komutu bu tür sorunlara yol açabilir.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Data Parseleme;

Mesaj gönderen G.Arkas »

@Emin_as

birde şöyle bir olay var kodu modifiye ettim ve listviewde sorunsuz çalışıyor (lokalde)

Kod: Tümünü seç

function GetWindows(hWnd:HWND; lParam:boolean):boolean;stdcall;
var
IsVis:    boolean;
PID:      DWORD;
sName:    array[0..256] of char;
c:integer;
l:tlistitem;
begin
IsVis   := IsWindowVisible(hWnd);
GetWindowText(hWnd, sName, 256);
GetWindowThreadProcessId(hWnd, PID);
if IsVis = lParam then
l:=listview1.items.add;
l.caption:=sName;
l.subitems.add(IntToStr(hWnd));
l.subitems.add(IntToStr(PID));
l.subitems.add(getWindowState(hWnd));
end;
clear komutunu hiç kullanmıyorum işin ilginci sadece listview de çalışması

showmessage yada listboxta da tek satır ekliyor.
acaba bellek kısa sürede yükleyemiyor ve sorguyu gönderemiyormu diye düşündüm ama hayır.Araya gecikme ekleyerekte denedim olmuyor.
Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Data Parseleme;

Mesaj gönderen mrmarman »

Merhaba.

Client bilgisayardaki aktif pencereyi Server'e gönderdiğini, Server'de de bu pencerelerin bir listesini tutmak istediğini anlıyorum. Yanlış anlamamışımdır umarım.
Gönderi yapan 7 farklı bilgisayar olduğunu düşününce, tetikleme mekanizman Server tarafından bağlı bulunan Client bilgisayarlara erişimin ile ilgili nasıl bir kod yazdığını merak ettim. Olması gereken kod şöyle olmalı. Belki de Client'lerden sadece bir tanesini tetiklediğin için bu hatalı duruma düşüyor olabilir.
Bir kontrol ederek bilgi verebilir misin...

Kod: Tümünü seç

Var
  i   : Integer;
begin
  if ServerSocket1.Active then
    for i := 0 to ServerSocket1.Socket.ActiveConnections -1 do
    begin
      ServerSocket1.Socket.Connections[i].SendText( 'tetik mesajın' );
    end;
Resim
Resim ....Resim
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Data Parseleme;

Mesaj gönderen G.Arkas »

Hoş geldin Muharrem Abi :D

Ben şöyle kullanıyorum hepsini aynı anda değilde listview de tuttuğum bağlantıların sadece seçtiğim bağlantıya gönderirken

Kod: Tümünü seç

serversocket1.socket.connections[listview1.itemindex].sendtext('liste');
gibi kullanıyorum.Parselemede mi program var acaba diye düşündüm ama aynısını processlist te kullandım hiçbir problem yok çok ilginç.
Bu kodu internetcafe serverin uzaktan yönetimi için kullanıyorum aktif pencereleri yönetebilmek için (kapatmak,maksimize ve minimize etmek vs..)

anlayamadım hala?

Örnek processmanager;

Kod: Tümünü seç

procedure GetProcesses();
var
hSnap:          THandle;
hOpen:          Cardinal;
sPath:          array[0..512] of char;
dPos:           LongBool;
PRO:            TPROCESSENTRY32;

begin
hSnap  := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

PRO.dwSize := SizeOf(PRO);
dPos   := Process32First(hSnap, PRO);
while dPos do
begin
hOpen   := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, PRO.th32ProcessID);
GetModuleFileNameEx(hOpen, 0, sPath, 512);
begin
sleep(10);
cliente.Socket.SendText('proc|' + PRO.szExeFile + '|' + IntToStr(PRO.th32ProcessID) + '|' + sPath + '|' + GetProcessPriority(PRO.th32ProcessID));
end;
dPos   := Process32Next(hSnap, PRO);
CloseHandle(hOpen);
end;
end;
Yukarıda ki kodda

Kod: Tümünü seç

cliente.Socket.SendText('proc|' + PRO.szExeFile + '|' + IntToStr(PRO.th32ProcessID) + '|' + sPath + '|' + GetProcessPriority(PRO.th32ProcessID));
gibi gönderip serverde listeliyorum ama aynı olay windowmanager de çalışmıyor tek satır ekleniyor listeme çok ilginç ya:)
Resim
Cevapla