PDA

View Full Version : دوستانی که با قفل tiny کار کردن این ارور برای چی هست



mina.net
چهارشنبه 06 آبان 1388, 07:59 صبح
سلام دوستان
من مدتی هست که از قفل سخت افزاری tiny استفاده می کنم. گاها یک ارور با متن
COM object that has been separated from its underlying RCW cannot be used
ظاهر می شه. البته هر شاید 30-40 باری که therd مربوطه کار می کنه یک بار این خطا ظاهر می شه. لطفا دوستانی که می تونن کمک کنن.

DoDoklak
چهارشنبه 06 آبان 1388, 09:22 صبح
احتمالا به این خاطر هستش که thread ها رو از حافظه خارج نمیکنی و همینطور که تعداشون زیادتر میشه ترافیک بیشتری روی پورت به وجود میاد و این مشکل ظاهر میشه

mina.net
چهارشنبه 06 آبان 1388, 14:38 عصر
احتمالا به این خاطر هستش که thread ها رو از حافظه خارج نمیکنی و همینطور که تعداشون زیادتر میشه ترافیک بیشتری روی پورت به وجود میاد و این مشکل ظاهر میشه
اگه می شه کمی بیشتر توضیح دهید چطور باید thread رو از حافظه خارج کرد؟

DoDoklak
چهارشنبه 06 آبان 1388, 18:04 عصر
هر بار که thread رو Start میکنی باید بعد از اتمام کار Stop کنی
برای از بین بردنش میتونی اونو Dispose کنی
هر چند وقتی برنامه رو میبندی خودش dispose میشه ولی تا زمانی که برنامه در حال اجرا است dispose نمیشه

mina.net
پنج شنبه 07 آبان 1388, 15:50 عصر
هر بار که thread رو Start میکنی باید بعد از اتمام کار Stop کنی
برای از بین بردنش میتونی اونو Dispose کنی
هر چند وقتی برنامه رو میبندی خودش dispose میشه ولی تا زمانی که برنامه در حال اجرا است dispose نمیشه
سلام دوست عزیز
آیا باید از همچین کد های استفاده کرد.


Thread_name.Sleep()
Thread_name.stop()
Thread_name.dispose()

هر کدوم از اینها رو استفاده کردم با خطای


Error 8 Overload resolution failed because no accessible 'Sleep' accepts this number of arguments. C:\Documents and Settings\barbod\Desktop\destop\tala\anbar\asnad_pa rdakhtani1.vb 126 13 anbar

مواجه شدم

mina.net
جمعه 08 آبان 1388, 14:08 عصر
کسی نمی خواد کمک کنه؟

DoDoklak
شنبه 09 آبان 1388, 09:23 صبح
وقتی شما از متد Thread_name.Sleep() استفاده میکنی باید زمانشو تعیین کنی تا سیستم عامل بفهمه تا چه مدت زمانی باید اونو رو متوقف کنه اگه به پیغام خطا توجه کنی شما پارامتر متد که همون زمان انتظار هستش رو وارد نکردی
الیته احتیاجی به Thread_name.Sleep() نیست شما بعد از اتمام کار از dispose استفاده کن

اگه نتونستی مشکلتو حل کنی سعی میکنم یه مثال از مدیریت Threat براتن بزارم

mina.net
شنبه 09 آبان 1388, 14:34 عصر
وقتی شما از متد Thread_name.Sleep() استفاده میکنی باید زمانشو تعیین کنی تا سیستم عامل بفهمه تا چه مدت زمانی باید اونو رو متوقف کنه اگه به پیغام خطا توجه کنی شما پارامتر متد که همون زمان انتظار هستش رو وارد نکردی
الیته احتیاجی به Thread_name.Sleep() نیست شما بعد از اتمام کار از dispose استفاده کن

دوست عزیز اگه توجه کرده باشی من 3 خط کد گذاشتم که هر سه خطا می دن.



اگه نتونستی مشکلتو حل کنی سعی میکنم یه مثال از مدیریت Threat براتن بزارم

بله اگه زحمت شو بکشی ممنون می شم.

DoDoklak
شنبه 09 آبان 1388, 15:51 عصر
دوست عزیز اگه توجه کرده باشی من 3 خط کد گذاشتم که هر سه خطا می دن
برنامه شما تو خط اول که مربوط به Sleep هستش با مشکل برخورد میکنه دیگه بقیه رو نمیخونه

اگه به این قسمت متن خطا توجه کرده باشی مشخصه

because no accessible 'Sleep' accepts this number of arguments

mina.net
شنبه 09 آبان 1388, 17:14 عصر
برنامه شما تو خط اول که مربوط به Sleep هستش با مشکل برخورد میکنه دیگه بقیه رو نمیخونه

اگه به این قسمت متن خطا توجه کرده باشی مشخصه
سلام دوست عزیز
مثل اینکه من بد منظورم رو رسوندم. منظورم اینه که از هر کدوم از این سه خط کد(جدا جدا) استفاده کردم خطا داد.

اگه با مثال و کد توضیح بدید ممنون می شم.

mgh64120
شنبه 09 آبان 1388, 17:26 عصر
عذر ميخوام من ميخوام براي نرم افزاري كه تهيه كردم، از قفل Tiny استفاده كنم و هيچ اطلاعاتي در اين زمينه ندارم اگه ميشه راهنماييم كنيد كه از كجا شروع كنم و غيره.

mina.net
شنبه 09 آبان 1388, 19:07 عصر
عذر ميخوام من ميخوام براي نرم افزاري كه تهيه كردم، از قفل Tiny استفاده كنم و هيچ اطلاعاتي در اين زمينه ندارم اگه ميشه راهنماييم كنيد كه از كجا شروع كنم و غيره.
تو google سرچ کن "منشور سیمین" برو تو سایتشون اطلاعات کاملی هست . موقعی هم که ازشون خرید می کنی کد های راهنما و pdf بهت می دن و اگه خودت هم یکم تلاش کنی می تونی از این قفل به خوبی استفاده کنی.

DoDoklak
یک شنبه 10 آبان 1388, 09:33 صبح
استفاده از Thread در DotNet

مقدمه :

Thread ها ابزاری مفید هستند که به کاربر اجازه می دهند تا اعمالی را به صورت موازی (Parallel) و همزمان انجام دهد. با استفاده از Thread ها، از امکانات MultiTasking در یک برنامه استفاده می کنید. در ضمن می توانید یک قسمت از برنامه را متوقف و یا به جریان بیندازید. در استفاده از Threadها بسیار مراقب باشید چون منابع شما محدود هستند.
Threadها هنگامی که باید منتظر پاسخ بخشی دیگر از برنامه باشید، بسیار به کار می آیند و شما می توانید در حالی که بخشی از برنامه متوقف است و منتظر پاسخ است بقیه قسمت ها را پیش ببرید که سرعت برنامه های شما را به طرز قابل ملاحظه ای افزایش می دهد..
در C# کلاسهایی برای استفاده از Thread ها وجود دارندکه در System.Threading قرار دارند. در ادامه یک مورد ساده ی استفاده از Thread شرح داده می شود. امید است که مورد استفاده واقع شود.

کار با Thread ها :

در ابتدا باید یک Object از نوع System.Threading.Thread ایجاد کنید. کلاس Thread تنها یک ایجادکننده (Constructor) دارد که یک ThreadStart (که یک Delegate است) می گیرد. برای توابع static می توان مستقیما نام تابع را ارسال کرد. تابع نوشته شده باید هیچ پارامتری نداشته باشد و هیچ مقداری را نیز برنگرداند (یعنی void باشد) به این علت که تابع اصلی این گونه تعریف شده است.


public static void MyCallbackFunction()
{
while (true)
{
System.Console.WriteLine(“ Hey!, My Thread Function Running”);
}
}


Thread MyThread = new Thread(new ThreadStart (MyCallbackFunction));
MyThread.Start();

بعد از ایجاد Thread می توانید آن را با Start، شروع کنید. Thread را می توانید با Abort بکشید که باعث ایجاد یک ThreadAbortException خواهد شد. با Suspend و Resume هم می توانید Thread را متوقف و یا مجددا به حرکت بیندازید.
Thread یکی از حالت های زیر را دارد که با ThreadState قابل مشاهده است:
Thread StateDescriptionUnstartedThread is Created within the common language run time but not Started still.RunningAfter a Thread calls Start methodWaitSleepJoinAfter a Thread calls its wait or Sleep or Join method.SuspendedThread Responds to a Suspend method call.StoppedThe Thread is Stopped, either normally or Aborted.


اولویتها نیز بر طبق استاندارد زیر بررسی میسود


Lowest, BelowNormal, Normal, AboveNormal, Highest
که در حالت عادی Normal است.

MultiTreadingمثال های بیشتر برای


برنامه زیر یک برنامه ی مفید و ساده برای دریافتن مفهوم مفهوم فوق است


using System;
using System.Threading;
class Tester
{
static void Main( )
{
// make an instance of this class
Tester t = new Tester( );
// run outside static Main
t.DoTest( );
}
public void DoTest( )
{
// create a thread for the Incrementer
// pass in a ThreadStart delegate
// with the address of Incrementer
Thread t1 = new Thread( new ThreadStart(Incrementer) );
// create a thread for the Decrementer
// pass in a ThreadStart delegate
// with the address of Decrementer
Thread t2 =
new Thread( new ThreadStart(Decrementer) );
// start the threads
t1.Start( );
t2.Start( );
}
// demo function, counts up to 1K
public void Incrementer( )
{
for (int i =0;i<1000;i++)
{
Console.WriteLine("Incrementer: {0}", i);
}
}
// demo function, counts down from 1k
public void Decrementer( )
{
for (int i = 1000;i>=0;i--)
{
Console.WriteLine("Decrementer: {0}", i);
}
}
}

Output:
Incrementer: 102
Incrementer: 103
Incrementer: 104
Incrementer: 105
Incrementer: 106
Decrementer: 1000
Decrementer: 999
Decrementer: 998
Decrementer: 997

DoDoklak
یک شنبه 10 آبان 1388, 09:34 صبح
پیوند زدن Thread ها و متوقف کردن آنها

بااستفاده از join می توانید Thread ها را به هم وصل کنید و با Seleep برای لحظاتی چند متوقف کنید. یک نمونه ی ساده در زیر آمده است :


using System;
using System.Threading;
class Tester
{
private int counter = 0;
static void Main( )
{
// make an instance of this class
Tester t = new Tester( );
// run outside static Main
t.DoTest( );
}
public void DoTest( )
{
Thread t1 = new Thread( new ThreadStart(Incrementer) );
t1.IsBackground=.\content/fa/kb/thread/true;
t1.Name = "ThreadOne";
t1.Start( );
Console.WriteLine("Started thread {0}",
t1.Name);
Thread t2 = new Thread( new ThreadStart(Incrementer) );
t2.IsBackground=.\content/fa/kb/thread/true;
t2.Name = "ThreadTwo";
t2.Start( );
Console.WriteLine("Started thread {0}",
t2.Name);
t1.Join( );
t2.Join( );

// after all threads end, print a message
Console.WriteLine("All my threads are done.");
}
// demo function, counts up to 1K
public void Incrementer( )
{
try
{
while (counter < 1000)
{
int temp = counter;
temp++; // increment
// simulate some work in this method
Thread.Sleep(1);
// assign the decremented value
// and display the results
counter = temp;
Console.WriteLine("Thread {0}. Incrementer: {1}",Thread.CurrentThread.Name,counter);
}
}
catch (ThreadInterruptedException)
{
Console.WriteLine("Thread {0} interrupted! Cleaning up...",Thread.CurrentThread.Name);
}
finally
{
Console.WriteLine("Thread {0} Exiting. ",Thread.CurrentThread.Name);
}
}
}


Output:
Started thread ThreadOne
Started thread ThreadTwo
Thread ThreadOne. Incrementer: 1
Thread ThreadOne. Incrementer: 2
Thread ThreadOne. Incrementer: 3
Thread ThreadTwo. Incrementer: 3
Thread ThreadTwo. Incrementer: 4
Thread ThreadOne. Incrementer: 4
Thread ThreadTwo. Incrementer: 5
Thread ThreadOne. Incrementer: 5
Thread ThreadTwo. Incrementer: 6
Thread ThreadOne. Incrementer: 6

DoDoklak
یک شنبه 10 آبان 1388, 09:35 صبح
استفاده از InterLock

یکی دیگر از امکاناتی که در اختیار دارید، امکان InterLock است که براساس آن می توانید برای برنامه های در حال اجرا Lock تعریف کنید. برای این کار C# تابعی به نام InterLock در اختیار شما قرار می دهد که شامل دو تابع Increment و Decrement است.
نمونه ی ساده ای از نحوه استفاده و خروجی تابع در زیر آمده است:


public void Incrementer( )
{
try
{
while (counter < 1000)
{
Interlocked.Increment(ref counter);
// simulate some work in this method
Thread.Sleep(1);
// assign the decremented value
// and display the results
Console.WriteLine("Thread {0}. Incrementer: {1}", Thread.CurrentThread.Name,counter);
}
}
}

Output (excerpts):
Started thread ThreadOne
Started thread ThreadTwo
Thread ThreadOne. Incrementer: 1
Thread ThreadTwo. Incrementer: 2
Thread ThreadOne. Incrementer: 3
Thread ThreadTwo. Incrementer: 4
Thread ThreadOne. Incrementer: 5
Thread ThreadTwo. Incrementer: 6
Thread ThreadOne. Incrementer: 7
Thread ThreadTwo. Incrementer: 8
Thread ThreadOne. Incrementer: 9
Thread ThreadTwo. Incrementer: 10
Thread ThreadOne. Incrementer: 11
Thread ThreadTwo. Incrementer: 12
Thread ThreadOne. Incrementer: 13
Thread ThreadTwo. Incrementer: 14
Thread ThreadOne. Incrementer: 15
Thread ThreadTwo. Incrementer: 16
Thread ThreadOne. Incrementer: 17
Thread ThreadTwo. Incrementer: 18
Thread ThreadOne. Incrementer: 19
Thread ThreadTwo. Incrementer: 20

mina.net
یک شنبه 10 آبان 1388, 14:30 عصر
سلام دوست عزیز جناب DoDoklak (http://www.barnamenevis.org/forum/member.php?u=43259)
من نمی دونم چرا شما دوست دارید اینقدر حاشیه برید من می خوام از یک theard در مواقعی صرف نظر کنم، استاپ کنم و یا موقتا از کا بندازم. در صورتی که شما ...
من فکر نمی کنم هیچ یک از کد های که شما گذاشتی مشکل من رو حل کنه. تا اونجای که من حدث می زنم احتمالا خطای که من در پست اول گفتم به خاطر یکی از دو مورد زیر هست.
1- قبلا از اینکه therad به اتمام برسه بخواهیم فرم رو ببندیم.
2- قبلا از اینکه therad تمام بشه دوباره همون therad رو استارت کنیم.

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

DoDoklak
یک شنبه 10 آبان 1388, 15:53 عصر
من نمی دونم چرا شما دوست دارید اینقدر حاشیه برید من می خوام از یک theard در مواقعی صرف نظر کنم، استاپ کنم و یا موقتا از کا بندازم. در صورتی که شما ...

توضیحات و نمونه کدهای بالا فقط در جهت درک مفاهیم کار با Thread هستش.
و برای عصبانیت شما دلیلی نمی بینم.


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


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

مطالب بالا برای این بود تا یکم بیشتر نحوه ی کار therad رو متوجه بشید.

به نمونه کد زیر توجه کنید


Dim LockThread AsNew System.Threading.Thread(AddressOf YourFunction)
LockThread.Start()
LockThread.Abort()

به محض اینکه therad به حالت اجرا میره توسط دستور


LockThread.Abort()

اجراش متوقف میشه

mina.net
یک شنبه 10 آبان 1388, 16:53 عصر
سلام دوست عزیز
نه من عصبانی نشدم. من چیکاره ام که عصبانی بشم. شما دارید لطف می کنید و جواب می دید. فقط خواستم برید رو اصل مطلب.


در این مورد هم برای therad مشکلی براش به وجود نمیاد چون therad بصورت موازی کار میکنند و برای هم مشکل درست نمیکنند مگر اینکه از دادهای مشترکی استفاده کنند که باید با تکنیک بافر چرخشی مدیریتشون کرد

درسته از داده های مشترکی استفاده می کنن. ولی چرا من هر وقت دارم برنامه رو می بندم این اتفاق می فته؟

تکنیک بافر چرخشی : اگه می شه در این مورد بیشتر توضیح بفرمایید.

mina.net
یک شنبه 10 آبان 1388, 16:59 عصر
گفتم اگه کد رو بزارم بهتر می تونید نظر بدید. البته کد فقط اینا نیستن ولی چیزی که ربط به کار ما داشت رو گذاشتم.


Sub check_lock_main1()
'************************************************* *****************************
Randomize() '*
Dim int_random AsInteger = CInt(Int((5 * Rnd()) + 1)) '*
If int_random = 2 Then'*
AxTiny1.Initialize = True'*
AxTiny1.UserPassWord = "pasword"'*
AxTiny1.ShowTinyInfo = True'*
If AxTiny1.TinyErrCode <> 0 Then'*
str_lock_one = "close_one"'*
str_lock_two = "close_two"'*
str_lock_three = "close_three"'*
str_lock_four = "close_four"'*
ElseIf AxTiny1.SpecialID <> "SpecialID "Then'*
str_lock_one = "close_one"'*
str_lock_two = "close_two"'*
str_lock_three = "close_three"'*
str_lock_four = "close_four"'*
Else'*
AxTiny1.Initialize = False'*
AxTiny1.ShowTinyInfo = False'* '*
str_lock_one = ""'*
str_lock_two = ""'*
str_lock_three = ""'*
str_lock_four = ""'*
EndIf'*
EndIf'*
'************************************************* *****************************
bol_exit_Thread = False
EndSub



و برای فراخوانی از کد زیر استفاده می کنم


check_lock = New Thread(AddressOf check_lock_main1)
If bol_exit_Thread = FalseThen'*
bol_exit_Thread = True'*
check_lock.Start() '*
EndIf'*

DoDoklak
یک شنبه 10 آبان 1388, 17:17 عصر
درسته از داده های مشترکی استفاده می کنن. ولی چرا من هر وقت دارم برنامه رو می بندم این اتفاق می فته؟

بستگی به این داره Threat شما چه عملی انجام میده آیا فقط اطلاعات میخونه یا مینوسه

تکنیک بافر چرخشی : اگه می شه در این مورد بیشتر توضیح بفرمایید.
این تکنیک یک روش منطقی است که برنامه نویس با توجه به عملکرد پروسه هایی که داره الگوریتم اونو پیاده سازی میکنه .
درکل این تکنیک کلا توسط برنامه نویس مدیریت میشه که متاسفانه روش مشکلیه و احتیاج به دقت زیادی داره
برای یادگیری بیشتر میتونی از کتاب
1- ویژوال بیسیک .Net نویسنده Deitel & deitel فصل چهردهم کتاب استفاده کنی
2-مفاهیم سیستم های عامل مهراد فهیمی

اما برای رفع مشکل شما به نظر من شما باید یک متغیر سراری تو یک ماژول تعریف کنید

Public Flag As boolean
وقتی یک threat شروع به کار میکنه این متفییر رو بررسی کنه اگر True بود باید متوقف بشه اگر نه اجرا بشه و متغیر رو True کنه تا هیچ Threat دیگی اجرا نشه و بعد از اتمام کار متغیر رو False کنی تا Threat بعدی بتونه اجرا بشه و وقتی برنامه رو میبندید این متغیر رو بررسی کنید که اگر True بود یعنی یک Threat در حال بررسی است و از خروج انصراف بدید یا Threat مربوطه رو ببندید
عمل بالا تقریبا شبیه یک بافر چرخشی انحصاری هستش.تو بافر چرخشی غیر انحصاری مدیریت فرق میکنه ولی روش بالا کار شما رو راه میاندازه
موفق باشید

DoDoklak
یک شنبه 10 آبان 1388, 17:51 عصر
باتوجه به سورسی که گذاشتید من خودم از سورس زیر برای خودندن قفل استفاده میکنم


PrivateSub DetectLock()
Try
Tiny1.Initialize = True
If Tiny1.TinyErrCode = 0 Then
Tiny1.UserPassWord = "E44ACDC6DE9BB41A216EACF447CDE4A"
Tiny1.ShowTinyInfo = True
If Tiny1.ShowTinyInfo = TrueThen
'شناسایی قفل
MessageBox.Show("çهé ¬ëں«ںیی ¬§", "¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
Me.DetectError()
End
EndIf
Else
Me.DetectError()
End
EndIf
Catch ex As Exception
Tiny1.Initialize = False
End
EndTry
EndSub
PrivateSub DetectError()
'عدم شناسایی قفل
If Tiny1.TinyErrCode = 1 Then
MessageBox.Show("çهé پی§ں 묧", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 2 Then
MessageBox.Show("کéی§ کں© © ں¬¢ ںى ں«¢", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 3 Then
MessageBox.Show(" م§ ںھ ¬ëں«ںیی çهé ىëگںê ¦يںë§ë یں ëي¬¢ë çهé ميà ¬§ى ں«¢", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 4 Then
MessageBox.Show("¦لں §© ëي¬¢ë ںلéںمں¢ §© çهé", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 5 Then
MessageBox.Show("¦لں §© ¬ëں«ںیی çهé §© ¥ںé¢ ¬ کى", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 6 Then
MessageBox.Show("¦لں §© ه©«¢ںë یں گ©ه¢ë ںلéںمں¢ §© ¥ںé¢ ¬ کى", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 7 Then
MessageBox.Show("¢م§ں§ کں© © ¢¥¢ ¬ کى ی¬¢© ںھ ¥§ ê¤ںھ ں«¢ یں çهé ¢¥¢ ¬ کى ëêی ں¬§", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 8 Then
MessageBox.Show("¢م§ں§ کں© © ¢¥¢ ¬ کى ی¬¢© ںھ ¥§ ê¤ںھ ں«¢ یں çهé ¢¥¢ ¬ کى ëêی ں¬§", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 9 Then
MessageBox.Show("ëںêم¢ © ي§ë ںلéںمں¢ êë¢çé ¬§ى یë «©يی« ي ںک¢یيںیک«", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf Tiny1.TinyErrCode = 10 Then
MessageBox.Show("çهé ëںêم¢ © ں«¢", "¦لں §© ¬ëں«ںیی çهé", MessageBoxButtons.OK, MessageBoxIcon.Error)
EndIf
Tiny1.Initialize = False
End
EndSub


متنهای به ریخته متن فارسی که به کاربر نشون میده ولی حالا اینجا به ریخته
من تو بدترین شرایط هم اگر Threat رو هم نبندم باز دچار مشکل مثل شما نشدم. این سورسو هم امتحان کنید .
هرچند خیلی شبیه هستند ولی تفاوتهای جزیی دارند

mina.net
یک شنبه 10 آبان 1388, 18:19 عصر
خوب شما از try استفاده کردی و هر وقت خطای بود ازش مگزره. کد من هم تقریبا مشابه کد شماست خیلی فرقی ندارد. یعنی نحوه چک کردن یکی هست. که خطا هم در همون قسمت روی می ده.

شما برای آزمایش اون قسمت از کد رو بدون try بنویسید و برنامه رو طوری اجرا کنید که 20-30 بار این thread اجرا بشه و سپس بلافاصله اون فرم رو ببندید . برای من در چنین حالتی هست که خطا ایجاد می شه.
البته هنوز کاربر های برنامه من این خطا رو گزارش نکردن ولی خوب " پیشگیری بهتر از درمان هست "

شما آزمایش کنید اگه برای شما هم همچین مشکلی پیش بیاد می شه نتیجه گرفت که اشکال از کد ما نیست و شاید قفل تحمل این چک کردن های پیاپی و پشت سر هم رو نداشته باشه.که البته باید به "منشوری ها" گزارش کرد. نمی دونم اینها فقط گمانه زنی هست.
لطفا اگه می شه شما هم آزمایش کنید.

DoDoklak
دوشنبه 11 آبان 1388, 08:43 صبح
قفلهای Tiny شامل سه مدل از نوع USB هستند
Tiny,Tiny HID,MINI Tiny HID
که از سه گزینه فوق MINI Tiny HID جدید از همه است و مشکلات کمتری داره توصیه میکنم از اون استفاده کنید

برای فایل Tiny.Ocx ورژن جدیدش اومد یعنی نسخه 4.1.1.0 حتما از آخرین OCX مربوطه استفاده کنید
(البته این OCX جدید روی مدل Tiny قدیمی کار نمیکنه)

در ضمن شما باید همیشه تو برنامه هاتون از try استفاده کنید چون هر چقدر هم خطاها رو پیش بینی کرده باشید باید بازم امکان داره یه چیزی رو یادتون رفته باشه.مخصوصا تو کار با سخت افزارها که این مشکلات زیاد به وجود میاد

mina.net
دوشنبه 11 آبان 1388, 14:44 عصر
که از سه گزینه فوق MINI Tiny HID جدید از همه است و مشکلات کمتری داره توصیه میکنم از اون استفاده کنید

اتفاقا من هم از همین استفاده می کنم.

DoDoklak
دوشنبه 11 آبان 1388, 15:37 عصر
آیا از نسخه جدید OCX هم استفاده می کنید.در هنگام قفلهای Tiny HID ورژن 4.0.0.1 بود ولی حالا با آمدن MINI Tiny HID تبدیل به 4.1.1.0 شده OCX مربوطه تو سایت منشور سیمین هست حتما اونو بگیرید و باز تست کنید