# Native Code > برنامه نویسی در Delphi > برنامه نویسی در Delphi Prism >  کنترل موقیت کاربر در نرم افزار با استفاده از ريجیستری

## صمد حسین زاده آزاد

سلام 
من برای کنترل فعالیت کاربر در محيط نرم افزاری که همزمان نتونه 2 پروسه را در حال اجرا داشته باشه ، از ریجیستری استفاده کردم ، به اين صورت که با ورود کاربر به هر پروسه کلِدی در ريجیستری ویندوز به عددی خاص مثلاً 001 تغییر پیدا می کنه و هنگام خروج از پروسه همون کلید به مقدار 000 تغییر می کنده ، همينطور برای سایر پروسه ها اعدادی اختصاص داده شده ،.. 010 و 011 و 100 و ... 
با این روش می تونم اولاً در هر لحظه بدونم کاربر کجاست و روش کنترل داشته باشم ، ثانياً می تونم به هر کاربر اجازه دسترسی همزمان به تعداد مشخصی پروسه را بدم .
من اينکار رو با ایجاد کلید ديگه ای برای اينکه اچازه ندم برنامه به طور همزمان اجرا بشه ، یعنی در هر کلاينت فقط نرم افزار مذکور 1 بار اجرا بشه ، استفاده کردم .
تا اینجا مشکلی پیش نمی یاد 
مشکل زمانی پيش می یاد که قطع برق داشته باشِیم و یا کاربر بصورت غیر عادی برنامه رو قطع کنده ، یعنی از کلید خروج و یا بستن نرم افزار به هر صورت که واقعه On Close نادیده گرفته بشه ( کدهایی که کلیدها رو به حالت اول بر می گردونند رو نادیده بگیره ) اونوقت زمانی که نرم افزار دوباره اجرا می کنم چون کلیدها ریجیستری صفر نشده با اینکه هيچ پروسه ای در حال اجرا نیست ولی با توجه به شرطهایی که تو برنامه گذاشتم مدام اخطارهای رو بکاربر نشون می ده درست مثل وقتی که کاربر می خواد چند پروسه رو با هم اجرا کنه . 
نمی دونم شايد برای دوستان خنده دار باشه و راه حل خيلی ساده داشته باشند ، اگه اينظوره به بزرگي خودتون بی سوادی منو ببخشید و راهنمایی کنید ...

----------


## vcldeveloper

> من برای کنترل فعالیت کاربر در محيط نرم افزاری  که همزمان نتونه 2 پروسه را در حال اجرا داشته باشه ، از ریجیستری استفاده کردم


از Mutex استفاده کنید. قبلا بحث شده.

----------


## vof.ir

این مشکلی که می فرمایید بنده هم در سناریویی دیگر دارم
و راه حلی هنوز برایش پیدا نکردم
همیشه هم برای من این سوال بوده که واقعا این بحث تراکنش به صورت اتمیک در پایگاه داده چه جوری پیاده سازی شده که ؟؟

----------


## BORHAN TEC

> همیشه هم برای من این سوال بوده که واقعا این بحث تراکنش به صورت اتمیک در پایگاه داده چه جوری پیاده سازی شده که ؟؟


با استفاده از LogFile. همانطور که میداید با استفاده از Transaction ها می توان چند دستور را اجرا کرد به طوی که اگر یکی از آنها به هر دلیلی انجام نشد از تمامی دستورات آن تراکنش هم صرف نظر می شود. در حالت کلی (به نظر من) RDBMS ها از روشی شبیه به مراحل زیر استفاده می کنند:
1- تراکنش T را که شامل دستورات t1, t2, t3, ... هست را در نظر بگیرید که برای اجرا به RDBMS مربوطه فرستاده شده است.
2- ابتدا می آییم و تراکنش را به همراه دستوراتش را در حافظه جانبی(در یک فایل، یک جدول و یا هر جای دیگری) به شکل مفهومی زیر ذخیره می کنیم:
[T]
t1 = Insert Into ....
t2 = Update ...
t3 = Delete ....
t4 = ....

3- حال دستورات تراکنش را دانه به دانه اجرا می کنیم. فقط به این نکته توجه داشته باشید که قبل از اعمال تغییرات حالات رکوردها هم باید در جایی ذخیره شوند. به عنوان مثال اگر رکوردی اضافه میشود باید بدانیم که کدام رکورد اضافه شده است و یا اگر رکوردی آپدیت شده باید بدانیم که کجایش تغییر کرده که در صورتی که تراکنش ناموفق بود بتوانیم داده های تغییر یافته را مجدداً به حالت اول برگردانیم. به عبارتی دیگر می توانیم این مسائل را هم در یک فایل دیگر ذخیره کنیم. 

4- مسئله اصلی اینجاست که اگر ور میان کار برق رفت بعداً از کجا باید بفهمیم که تراکنش کامل انجام شده است یا خیر؟ در این حالت طبیعی است که با اختصاص یک فلگ به هر تراکنش می توانیم این مورد را بررسی کنیم. به عنوان مثال می توانیم این فلگ را در همان فایلهای مربوطه قرار دهیم و به آن مقدار صفر را انتصاب دهیم و اگر توانستیم همه دستورات یک تراکنش را با موفقیت انجام دهیم به آن مقدار یک را نسبت می دهیم. حالا اگر وسط اجرای یک تراکنش برق رفت، ما می توانیم با چک کردن فلگ مربوطه متوجه شویم که تراکنش تا انتها اجرا نشده است و با استفاده از فایلهای جانبی که برای حفظ حالات رکوردها بر روی دیسک ذخیره کرده ایم می توانیم در همان ابتدای اجرای مجدد RDBMS خودمان(!) حالت رکوردها را به همان حالات قبل از اجرای تراکنش برگردانیم. 

طبیعی است که این مواردی که ذکر کرده ام فقط حالات بسیار کلی را شامل می شود و در عمل باید موارد بسیار زیاد دیگری در نظر گرفته شود.

----------


## vof.ir

با تشکر از توضیحات خوب شما
اما باز هم یک سوال
فرض کنید کل تراکنش انجام شد
دقیقا در جایی که میخواهیم اون فلگ پایانی را ست کنیم برق میره
و مجدد که برق میاد چون اون فلگ ست نشده دوباره کل اون تراکنش میخواد انجام بشه؟؟؟؟؟

----------


## BORHAN TEC

> و مجدد که برق میاد چون اون فلگ ست نشده دوباره کل اون تراکنش میخواد انجام بشه؟؟؟؟؟


خوب میشه برای هر دستور هم یک فلگ قرار داد که این سیاستها را بنا به نیاز و تشخیص طراحان RDBMS می توانند مورد توجه قرار دهند.

----------

