procedure TDMoyunlar.tmrOynDrmTimer(Sender: TObject);
begin
// ÖNCE OYUN VARMI BAK ----------------------------------------------------------
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from TBL_OYUNLARGECICI where ID=1');
IBQuery1.Open;
DMoyunlar.IBTransaction1.CommitRetaining;
if IBQuery1.fieldbyname('OYDRM').value<>Null then
begin
_drm1:=StrToInt(IBQuery1.fieldbyname('OYDRM').value);
if _drm1=1 then frmMain.L1.Visible:=True;
end
else
begin
frmMain.L1.Visible:=false;
end;
end;
sorun şu veritanında ilğili alanda değişiklik oluyor ama kod bunu alğılamıyor
sorun ne olabilir acaba
sorunla karşılaştığınızda en güzel yöntem, kendinizi bilgisayarın yerine koyun ve hiç yorum yapmadan, bir kağıt kalem alıp yazarak tek tek komutları çalıştırmak, sorunu bulmanıza yardım eder.
IBQuery1 yi kapat
IBQuery1 sql text ini sil
IBQuery1 sql text i ekle
IBQuery1 i aç
DMoyunlar.IBTransaction1.CommitRetaining; DMoyunlar.IBTransaction1. içine biriktirilmiş işlemleri veritabanına kalıcı olarak ekle ??? bu bilgi yığını içinde neler var ki?
IBQuery1 i etkilemez bu işlem, çünkü commit ten önce YENİ açılıyor
if IBQuery1.fieldbyname('OYDRM').value<>Null then
begin
_drm1:=StrToInt(IBQuery1.fieldbyname('OYDRM').value);
if _drm1=1 then frmMain.L1.Visible:=True;
end
kodları sadeleştirin, yaptım oldu deyip bırakmayın
frmMain.L1.Visible:=(IBQuery1.fieldbyname('OYDRM').asinteger=1);
ilgili field null ise AsInteger 0 değeri döndürür, asinteger=1 bunu compiler bir sorgu olarak görüp, sonucu True False olarak döndürüyor zaten (hangi versiyondan sonraydı ahtırlamıyorum ama kesin Delphi 7 ve üzeri kullanıyorsundur bu kod çalışır)
Timer default değerde zaten saniyede bir tetiklenir query yi habire sql i silip tekrar ekleyip muhtemelen bağlı olduğu transaction i commit et 3-5 dakka sona sistemin çöker.Queriyi bir kez yaz, parametre değişeceksede parambyname le sadece gereken parametreleri gönder, query i kapatıp transaction ı commit edip query yi aç.
bu arada DMoyunlar.IBTransaction1.InTransation false sa kodun çalışmasına gerek olmayan kesimlerini blockla, performans artışı sağlar
amaç sadece veritabanından değişiklik varmı kontrolü yapılacaksa, timer a ne gerek var sisteme yük, Firebird de "event" var her kim kayıt yaparsa ardından event gönderir, diğer bağlı nekadar terminal varsa haberdar olur. dakikada 60 kez db ye erişmek yerine sadece gerektiğinde baklır.
amacın networkte çalışan oyunsa ve bağlı olanlara bilgi göndermekse tcp/ip ile göndermek çokdaha performanslı olacaktır, oyunda bilgi gönderme işi çok sık olacaksa ve arada kayıp olsada sıkıntı değil ise udp de işini görecektir. ha bunlar ne diyeceksen sormadan önce indy, tcp/ip, socket olarak araştır
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak... Zoru başarırım, İmkansız zaman alır FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
IBDatabase1.DatabaseName:=_ip1+':'+_laneDByol+'\system\vt\OYUNLAR.FDB';
IBDatabase1.Connected:=True;
// ÖNCE OYUN VARMI BAK ----------------------------------------------------------
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select OYNDRM from TBL_OYUNDURUM where ID=1');
IBQuery1.open;
_drm1:=StrToInt(IBQuery1.fieldbyname('OYNDRM').value);
if _drm1=1 then frmMain.L1.Visible:=True;
if _drm1=0 then frmMain.L1.Visible:=false;
IBDatabase1.Connected:=false;
timer 10 sn'de bir bağlanıp okuyor oyun durumunu server/client olarak değilde direkt veritabanından öğrenmenin daha iyi olacağını düşündüm(2pc arasında)
veritabanına 1 kere bağlanıp sonra değişiklikleri almaya çalıştım ama olmadı ayrı bir tablo açtım tabloya 10 sn'de bir bağlanıp durumu okuyorum sonra bağlantıyı kapatıyorum başka türlü beceremedim..