(12-12-2017, Saat: 14:16)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Thread'ler tam da "saldım çayıra mevlam kayıra" için kullanılabilir. Ancaak! nasıl bir kod yazacağına göre durum değişebilir Konuyu biraz daha detaylandırabilirsen sanırım daha faydalı olabiliriz.
Tamda öyle bir iş için threada başvurdum
Senaryo şöyle MySQL'imde ortak bir Notification tablosu var, Diğer bazı tablolardaki, hareketlerde trigger ile otomatik bu tabloya kayıt atıyorum, içerisindeki fieldin biri de okundu , okunmadı bilgisi.
Bu tabloya düşen kayıtların hiç bekletmeksizin kullanıcılara Push edilmesini istiyorum. İşlemi de
Bu konudaki gibi yapıyorum Push ettikten sonra eğer mesaj başarılı ise okundu bilgisini güncelleyerek devam ediyorum.
Ama sıradaki diğer bildirimi göndermem için push işleminin bitmesi gerekiyor ki sıradaki bildirimi atayım.
Ben bu işlemi beklemeden var ise bildirim 10 kişiye birden atayım o procedure kendi içinde işi bitince tabloyu update edip kapasın yok olsun.
Zaten bu halde bile kullandığı ram 3mb dolaylarında
Şu an kullandığım yapı şu şekilde,
TMyNotify = class(TThread)
public
constructor Create(const Intent, Title, Text,UserToken,Id: string);
end;
constructor TMyNotify.Create(const Intent, Title, Text, UserToken, Id: string);
const apikey = 'AIzaSyDJ0---------mXdZuQ';
var
SStream : TStringStream;
Response : TMemoryStream;
t : TStringList;
Request : TclHttpRequest;
Cont,Data,Json:TJSONObject;
begin
inherited Create(true);
FreeOnTerminate := true;
Data := TJSONObject.Create;
Cont := TJSONObject.Create;
Data.AddPair('IntentCode',Intent);
Data.AddPair('ContentTitle',Title);
Data.AddPair('ContentText',Text);
Data.AddPair('NotificationId',Id);
Cont.AddPair('data',Data);
Cont.AddPair('to',UserToken);
t := TStringList.Create;
Response := TMemoryStream.Create;
Request := TclHttpRequest.Create(nil);
SStream := TStringStream.Create(Cont.ToJSON);
try
try
Request.RequestStream := SStream;
Request.Header.ContentType := 'application/json';
Request.Header.ExtraFields.Add('Authorization:key='+apikey) ;
Request.Header.ContentLength := IntToStr(SStream.Size);
DMod.firebase.post('https://fcm.googleapis.com/fcm/send', Request,Response);
Response.Position := 0;
t.LoadFromStream(Response);
Log(t.Text);
Json := TJSONObject.Create;
try
Json.Parse(BytesOf( t.Text ), 0);
if (Trim(Json.GetValue('success').ToString) = '1') then
begin
with DMod.Query do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE `notifications` SET delivered=1 where id=:id');
ParamByName('id').AsInteger := StrToInt(id);
Execute;
end;
end;
finally
Json.DisposeOf;
end;
except on E: Exception do
end;
finally
t.Free;
Response.Free;
Request.Free;
SStream.Free;
Cont.DisposeOf;
end;
Resume;
end;
procedure SendNotify(const Intent, Title, Text,UserToken,Id: string);
var Notify:TMyNotify;
begin
Notify := TMyNotify.Create(Intent, Title, Text,UserToken,Id);
end;