Speicher schnell allozieren



  • Hi

    Ich speichere folgendermassen Clipboardeinträge temporär:

    void SaveClipboardData(void){
    
    	OpenClipboard(NULL);
    
    	int cf = 0;
    
    	cf = CountClipboardFormats(); 
    
    	for ( int i = 0; i < cf; ++i ) {
    
    		UINT f = EnumClipboardFormats(f);
    
    		//printf("format: %i \n",f);
    
    		HGLOBAL hMem = GetClipboardData(f);
    
    		void * pMem = GlobalLock(hMem);
    
    		// Backup
    
    		HGLOBAL bMem = GlobalAlloc(GMEM_DDESHARE,GlobalSize(hMem));
    
    		void * bpMem = GlobalLock(bMem);
    
    		CopyMemory(bpMem, pMem, GlobalSize(hMem));
    
    		GlobalUnlock(pMem);
    
    		GlobalUnlock(bMem);
    
    		data[i] = bMem;
    		fs[i] = f;
    		max = i;
    
    	}
    
    	CloseClipboard();
    
    }
    
    void LoadClipBoardData(void){
    
    	OpenClipboard(NULL);
    
    	EmptyClipboard();
    
    	for ( int l = 0; l < max; ++l ){
    		SetClipboardData(fs[l],data[l]);
    		//LPSTR formatname = new char[256];
    		//if ( GetClipboardFormatName(fs[l],formatname,256) == 0 ){
    		//	formatname = "Unbekannt";	
    		//}
    		//printf("%s \t\t\t %i kb\n",formatname,GlobalSize(data[l])/1024);
    	}
    
    	CloseClipboard();
    
    }
    

    Bei grossen Daten ist diese Methode extrem langsam. Deshalb dachte ich an die Verwendung von VirtualAlloc. Ich weiss jedoch nicht wie man VirtalAlloc mit GlobalLock verwendet.

    MfG Joe



  • Hi,

    Deshalb dachte ich an die Verwendung von VirtualAlloc.

    Und wieso sollte das dann schneller gehen ?! 🙄



  • Hmm ich habe das ganze mal folgendermassen umgeschrieben:

    if (OpenClipboard(NULL) == 0)
    		printf("\n open cl failed!");
    
    	int cf = 0;
    
    	cf = CountClipboardFormats(); 
    
        int f;
    
    	HGLOBAL data[100];
    	UINT fs[100];
    
        memset(data,0,sizeof(data));
        memset(fs,0,sizeof(fs));
    
        int i;
    
    	for ( i = 0; i < cf; ++i ) {
    
    		f = EnumClipboardFormats(f);
    
    		if (f != 0 &&  f== 49298  )
    		{
    			printf("\n format: %d \n",f);
    
    			printf("get data\n");
    
    			HGLOBAL hMem = GetClipboardData(f);
    			//GlobalLock(hMem);
    
    			if (hMem == NULL)
    				printf("\n hMem = NULL");
    
    			ULONG size = GlobalSize(hMem);
    
    			printf("\n Size: %d kb",size);
    
    			HGLOBAL bMem = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size);
    
    			printf("\n %X %i",bMem,f);
    
    			CopyMemory(bMem, hMem, size );
    			//GlobalUnlock(bMem);
    
    			data[i] = bMem;
    			fs[i] = f; 
    		}
    	}
    
    	EmptyClipboard();
    
    	Sleep(5000);
    
    	for ( int l = 0; l < i; ++l ){
    
    		if (data[l] != 0 && fs[l] != 0)
    		{
    			if (SetClipboardData(fs[l],data[l]) == NULL)
                     printf("\n setclipboard failed!");
    
    			char * formatname = (char*)malloc(256);
    			if ( GetClipboardFormatName(fs[l],formatname,256) == 0 ){
    				formatname = "Unbekannt";	
    				printf("\n %s",formatname);
    			}
    
    		}
    	}
    
    	CloseClipboard();
    

    Nur bei einer grossen Menge Daten (RTF) dauert GetClipboardData() einfach ewigs. Die Speicherauslastung bildet dann eine Zitterlinie und die CPU Auslastung ist 100%. Ich habe nach Informationen gesucht, jedoch nichts gefunden, wie man das Clipboard bei grossen Daten sinvoll und effizients nutzt. Zudem weiss ich nicht, wie genau zum Beispiel, Word zu Word die Daten über das Clipboard transferiert (Grosse Datenmengen funktionieren problemlos).

    MfG Joe


Anmelden zum Antworten