PDA

View Full Version : ارتباط بین 2 فایل exe ساخته شده توسط #C



Himalaya
یک شنبه 21 بهمن 1386, 21:41 عصر
سلام...من 2 تا فایل exe دارم...که کار یکیش عکس گرفتن از دسکتاپه وکار اون یکی چک کردن اون عکسا...عکسای من روی هارد از شماره 1 تا 20 سیو میشن و دوباره عکس 21 روی عکس 1 و 22 روی 2 و به همین ترتیب ادامه سیو شدنشون ادامه پیدا میکنه(توی تایمر با تاخیر 1 هزارم ثانیه عکس میگیرم و برای جلو گیری از اشغال زیاد فضای هارد به ترتیبی که گفتم عکسا رو سیو میکنم...برنامه دوم هم عکسا رو چک میکنه(میخواد پیکسل خاصی رو پیدا کنه)و وقتی چک کردن 1 عکس تموم شد اون عکسو پاک هم میکنه...این برنامه هم عکس 20 رو که چک کرد ، بعد از اون میره سراغ چک کردن عکس 1و...اما مشکل از جایی پیدا میشه که برنامه سیو عکس از برنامه چک کردن عکس جلو بیفته یا عقب بیفته...(چون در اون صورت بالاخره تو یه عکس به هم میرسن و این ارور رو میده که عکس توسط یک برنامه دیگه در حال استفاده شدنه... البته من از طریق برنامه ای که عکسو چک میکنه میتونم برنامه سیو عکسو کنترل کنم...(البته اگه برنامه چک کردن جلو افتاد) یعنی برنامه چک کردن بخواد عکسی رو چک کنه که هنوز سیو نشده...من اینکارو کردم که از if و دستور file.exist استفاده کردم (دستور چک کردن رو هم تو تایمر نوشتم با تاخیر 1 هزارم ثانیه...چون سرعت برام مهمه)...اما با این روش من فقط از یک طرف پشت بوم نیافتادم...یعنی حالتی رو که برنامه سیو کردن از چک کردن جلو بیافته رو نمیتونم کنترل کنم...یعنی برنامه سیو کردن اگه سرعتش بیشتر باشه بالاخره میرسه به فایلی که برنامه چک کردن داره اونو چک میکنه و هنوز کار چک کردنش تموم نشده برنامه سیو کردن سعی میکنه روی اون دوباره یک عکس گرفته شده دیگه رو سیو کنه...که دوباره ارور میده فایل توسط برنامه دیگه ای در حال استفاده شدنه...اینو چه جوری حلش کنم نمیدونم...لطفا راهنماییم کنید...خیلی لازمش دارم ...ممنون...

sinpin
یک شنبه 21 بهمن 1386, 21:59 عصر
سلام...من 2 تا فایل exe دارم...که کار یکیش عکس گرفتن از دسکتاپه وکار اون یکی چک کردن اون عکسا...عکسای من روی هارد از شماره 1 تا 20 سیو میشن و دوباره عکس 21 روی عکس 1 و 22 روی 2 و به همین ترتیب ادامه سیو شدنشون ادامه پیدا میکنه(توی تایمر با تاخیر 1 هزارم ثانیه عکس میگیرم و برای جلو گیری از اشغال زیاد فضای هارد به ترتیبی که گفتم عکسا رو سیو میکنم...برنامه دوم هم عکسا رو چک میکنه(میخواد پیکسل خاصی رو پیدا کنه)و وقتی چک کردن 1 عکس تموم شد اون عکسو پاک هم میکنه...این برنامه هم عکس 20 رو که چک کرد ، بعد از اون میره سراغ چک کردن عکس 1و...اما مشکل از جایی پیدا میشه که برنامه سیو عکس از برنامه چک کردن عکس جلو بیفته یا عقب بیفته...(چون در اون صورت بالاخره تو یه عکس به هم میرسن و این ارور رو میده که عکس توسط یک برنامه دیگه در حال استفاده شدنه... البته من از طریق برنامه ای که عکسو چک میکنه میتونم برنامه سیو عکسو کنترل کنم...(البته اگه برنامه چک کردن جلو افتاد) یعنی برنامه چک کردن بخواد عکسی رو چک کنه که هنوز سیو نشده...من اینکارو کردم که از if و دستور file.exist استفاده کردم (دستور چک کردن رو هم تو تایمر نوشتم با تاخیر 1 هزارم ثانیه...چون سرعت برام مهمه)...اما با این روش من فقط از یک طرف پشت بوم نیافتادم...یعنی حالتی رو که برنامه سیو کردن از چک کردن جلو بیافته رو نمیتونم کنترل کنم...یعنی برنامه سیو کردن اگه سرعتش بیشتر باشه بالاخره میرسه به فایلی که برنامه چک کردن داره اونو چک میکنه و هنوز کار چک کردنش تموم نشده برنامه سیو کردن سعی میکنه روی اون دوباره یک عکس گرفته شده دیگه رو سیو کنه...که دوباره ارور میده فایل توسط برنامه دیگه ای در حال استفاده شدنه...اینو چه جوری حلش کنم نمیدونم...لطفا راهنماییم کنید...خیلی لازمش دارم ...ممنون...

چند سئوال :
چرا دو برنامه برای اینکار نوشتید ؟
و چرا عکسها رو روی هارد ذخیره میکنید ؟ (نمیشد streamوار کار کرد ؟)
---------------------------------------------------------------
در هر صورت مشکلی که طرح کردید دسترسی بدون کنترل به یک ناحیه ی بحرانی است.
کد شما رو ندیدم اما فکر میکنم با انحصاری کردن ناحیه بحرانی (Lock, Monitor, ...) مشکلتون حل بشه.
(و در اینگونه نامگذاری فایلها، معمولا از GUID استفاده میشه.)

lock Statement (C# Reference)

The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock.
The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread tries to enter a locked code, it will wait, block, until the object is released.
منبع : http://msdn2.microsoft.com/en-us/library/c5kehkcz.aspx (http://msdn2.microsoft.com/en-us/library/c5kehkcz.aspx)
لطفا پستهاتون رو خلاصه و مفیدتر بنویسید.

رضا عربلو
یک شنبه 21 بهمن 1386, 22:09 عصر
آیا هر دو برنامه را خودتان نوشته اید و یا دسترسی به سورس آنها دارید و یا می توانید تغییراتی در آنها ایجاد کنید. مثلاً نام عکس ها را به صورت تاریخ بدهید؟

Himalaya
دوشنبه 22 بهمن 1386, 09:33 صبح
sinpin جان شرمنده...راستش میترسم کم توضیح بدم ،طرف متوجه حرفام نشه...اما با این حال این آخرین باره که زیاد توضیح میدم...چون فکر کنم همه ، مشکلمو متوجه شن...
راستش برنامه واسه رباتهای فوتبالیسته...یه برنامه عکس بگیره و یکی اونا رو چک کنه...تو یکی از دانشگاه ها این کارو میکنن...حالا چرا از filestream یا تبدیل عکس به آرایه (که دومی سرعتش واقعا بیشتره)استفاده نمیکنم تو یه تایپیک دلیلشو گفتم(تایپیک عنوانش این بود...نحوه ذخیره عکس به صورت 24 بیت یا 32 بیت)...اگه بتونید کمکم کنید که از تبدیل عکس به آرایه یا حتی file stream (البته بدون سیو و لود عکسها)استفاده کنم ممنون میشم...


bmp100 = newBitmap(320, 240, PixelFormat.Format24bppRgb);
Graphics.FromImage(bmp100).CopyFromScreen(this.Loc ation.X + 14, this.Location.Y + 21, 0, 0, size1);
bmp100.SetResolution(72, 72);
bmp100.Save("C:/New/" + i100 + ".bmp", ImageFormat.Bmp);
bmp200 = newBitmap("C:/New/" + i100 + ".bmp");
byte[] arrima1 = newbyte[2];
arrima1 = (byte[])l.ConvertTo(bmp200, arrima1.GetType());

دو خط اول از یه پنل با یه سایز عکس میگیرن...برام مهمه که عکسه 24 بیت باشه...
خط سوم هم که معلومه چیکار میکنه...اگه اونو set نکنم رزولوشن عکس میشه 96 که کارامو بهم میزنه...تا اینجا همه چیز ردیفه ...یعنی میتونم از همون bmp100 که تو حافظه اس اونو تبدل به آرایه کنم(بدون سیو عکس)...اما مشکل چیه...مشکل Image format هستش...من لازم دارم تا حتما عکسام bmp ,24bit,با image format بی ام پی باشن...حالا شاید بگید خوب عکسه که خودش bmp هستش...ولی نه...تا از image format استفاده نکنم فرمتش jpeg هست...اینو از خودم نمیگم...با توجه به سرآیند(هدر)عکس گرفته شده میگم...تو #c من تنها راهی که پیدا کردم تا image format یه عکسو تغییر بدم تو قسمت save عکس بود...یعنی مجبورم عکسو سیو کنم تا IMAGE FORMAT اونو تغییر بدم و دوباره عکسو لود کنم که این باعث کندی کار میشه) اگه میشد image format عکسو چه میدونم مثلا مثل set Resolation بدون سیو کردن عکس تغییر بدم همه مشکلاتم حل میشد ...آیا راه دیگه ای برای تغییر image format عکس وجود داره که تو اون عکس احتیاج به سیو کردن نداشته باشه... منم اینقدر به اینکه یه نفر پیدا بشه جوابمو بده گیر نمیدادم...چون واقعا...واقعا لازمش دارم...ممنون...

Alireza_Salehi
دوشنبه 22 بهمن 1386, 13:56 عصر
خوب در اولین قدم میتونید این عکس رو در Stream ذخیره کنید و بعد دوباره از Stream بخونید خیلی سریع تر از فایل خواهد شد!

System.IO.MemoryStream ms=new System.IO.MemoryStream();
bmp.Save(ms,System.Drawing.Imaging.ImageFormat.Bmp );
bmp =(Bitmap) Bitmap.FromStream(ms);

بعدش هم شما در پردازش تصویر به مقادیر رنگ پیکسل ها نیاز دارید فرمت عکس که مهم نیست!
ImageFormat نحوه ذخیره سازی رو مشخص میکنه نه وضعیت پیکسل ها رو!

یک سوال:در ضمن دلیل عکس گرفتن از صفحه چیه؟