Başarısız olan çok karmaşık bir programım var ve bunu bir toplu iş dosyası ve C programı ile bu sınama kümesine göre basitleştirdim.Neden Windows 7'de dönüş kodunu test edemiyorum?
C programım, hata düzeyini bir toplu iş dosyasına geri döndürmek için ExitProcess kullanır. Bazen Windows 7'de (Microsoft Windows [Sürüm 6.1.7600]), hata seviyesi doğru şekilde yorumlanmıyor.
Sanırım bu sonsuza dek koşmalı. Windows XP'de sonsuza kadar çalıştığı görülüyor. İki farklı çift çekirdekli Windows 7 makinesinde (bir 64 bit bir 32 bit), birkaç dakika içinde başarısız olur.
Yanlış bir şey yaptığımı hayal edemiyorum, ancak Windows 7'de ExitProcess ile ilgili komik bir şey olması durumunda, sormam gerektiğini düşündüm. Burada yasadışı olarak yaptığım bir şey var mı? cmd.exe için
Toplu dosya test.bat:
@ECHO OFF
SET I=0
:pass
SET /A I=I+1
Title %I%
start/wait level250
if errorlevel 251 goto fail
if errorlevel 250 goto pass
:fail
Programı level250.c:
#include "windows.h"
static volatile int Terminate = 0;
static unsigned __stdcall TestThread(void * unused)
{
Terminate = 1;
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
while (Terminate == 0) Sleep(1);
ExitProcess(250);
}
Benim derleyici sürümü ve çağırma şunlardır:
Microsoft (R) 32-bit C/C++ Derleyici Sürüm 12.00.8804 için En İyi duruma getirme 80x86 için
Telif hakkı (C) Microsoft Corp 1984-1998. Her hakkı saklıdır.
cl/MT level250.c
Diğer bilgiler: Ben de JPSoft en TTK altında çalışan denenmiş ve CMD kullanarak aynı davranışı elde var. Düz bir .c programı kullanıyorum, değil .cpp. Tek bir dişli sürümde herhangi bir başarısızlık görmüyorum. Kaynakları ve ikili dosyaları http://jcook.info/win7fail'a koydum ve MD5 zip dosyası 579F4FB15FC7C1EA454E30FDEF97C16B ve CRC32 C27CB73D.
EDIT Önerilerden sonra, daha fazla test durumunu değiştirdim ve hala hataları görüyorum. Bizim gerçek uygulamada yüzlerce konu var. Bazı iplikler, bazı önemli dönüş kodları ile çıkmaktadır, bazıları sonsuza dek sürmektedir ve bazıları işletim sistemi çağrılarına veya dll'lerine asılmaktadır ve öldürmek için (imkansız değilse) zor olmaktadır. dönüş kodu aslında ne
#include "windows.h"
static unsigned __stdcall TestThread(void * unused)
{
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
return(250);
}
ExitProcess() 'ı aramadan önce iş parçacığının tamamlandıktan sonra katılmasını beklemiyor musunuz? – IanNorton
İş parçacığı sonlandırmasını beklemek için yoğun bir döngü yerine WaitForSingleObject() yöntemini kullanmalısınız. Ayrıca, doğrudan ExitProcess() 'i çağırmak yerine doğrudan WinMain()' dan 250 döndürün. Derleyicinin başlangıç kodu, WinMain() çıktıktan sonra ExitProcess() öğesini çağırır. –
@IanNorton: Konuların sonlandırılmasını ve/veya katılmasını beklemenin gerekli olduğuna inanmıyorum. Tüm programımız, ya asılı G/Ç veya sistem çağrıları ya da diğer nedenlerden dolayı sonlanamayan bazı iş parçacıklarına sahiptir. Microsoft'un bazı belgeleri var mı, bana bu konuya yeniden katılma gereksinimlerini gösterir? @Remy: Gerçek programımız çok daha karmaşık ve doğrudan test için bir sebep var. Sonuç olarak, Terminate değişkeninin tümünün kaldırılması sorunu çözmez. Yani, basitçe dönen bir iş parçacığı ve çıkıntıyı oluşturan bir WinMain çıkmaz. – piCookie